sqli-labs源码
由源码可知是数字型注入
127.0.0.1/Less-2/?id=1 and 1=1
php执行
$sql="SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1";
逻辑判断:1 and 1=1 --> 1且真,正确执行id=1,页面正常
127.0.0.1/Less-2/?id=1 and 1=2
php执行
$sql="SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1";
逻辑判断:1 and 1=2 --> 1且假,不能执行id=1,SQL语句没有报错,但是查询为空
127.0.0.1/Less-2/?id=1'#
php执行
$sql="SELECT * FROM users WHERE id=1'# LIMIT 0,1";
MySQL执行( # 是MySQL注释符)
SELECT * FROM users WHERE id=1'
判断:id为数值型,加 ' 使其变成字符型,页面报错
综上:由?id=1 and 1=1 正常,?id=1 and 1=2 报错,?id=1'# 报错可知,存在数字型注入点
DVWA源码
由源码可知是字符型注入
此题使用GET方法传参,可直接在url编辑参数
127.0.0.1:82/vulnerabilities/sqli/?id=1 and 1=1&Submit=Submit#
php执行
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=1';";
逻辑判断:id为INT型,1 and 1=1强制转换为1,页面正常
127.0.0.1:82/vulnerabilities/sqli/?id=1 and 1=2&Submit=Submit#
php执行
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=2';";
逻辑判断:id为INT型,1 and 1=2强制转换为1,页面正常
127.0.0.1:82/vulnerabilities/sqli/?id=1'#&Submit=Submit#
php执行
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1'#';";
MySQL执行( # 是MySQL注释符)
SELECT first_name, last_name FROM users WHERE user_id = '1'
判断:引号可以正常闭合,页面正常
综上:由?id=1 and 1=1 正常,?id=1 and 1=2 正常,?id=1'# 正常可知,存在字符型注入点
说明:
- 强制转换时,开头n位是整型就全部转换为该数值,后面字符串任意结果都相同
例如:
user_id = '1 and 1=2' 转为 user_id = '1'
user_id = '1 ikun' 转为 user_id = '1'
- 字符型注入时,引号必须提前闭合,否则注释符#不生效
例如:
user_id = '1 and 1=2#' 中 # 被当成字符,不会生效
user_id = '1' and 1=2#' 中引号提前闭合,# 生效注释掉后面 '