
涉及知识
堆叠查询注入
定义
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆(多条)SQL语句一起执行。而在真实的运用中也是这样的,我们知道在MySQL中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stackedinjection。
原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
比如MySQL可以堆叠注入,msSQL和Oracle都不支持
应用场景
比如注入需要管理员账号密码,密码是加密,无法解密,就可以使用堆叠注入insert进行插入数据,用户密码是自定义的,就能正常解密登录
以及其他场景,写在分号;之后的SQL语句自己定义,具体情况具体对待
WAF及绕过思路

wafw00f防火墙探测工具
工具简介
现在网站为了加强自身安全,通常都会安装各类防火墙。这些防火墙往往会拦截各种扫描 请求,使得测试人员无法正确判断网站相关信息。Kali Linux 提供了一款网站防火墙探测工具 Wafw00f。它可以通过发送正常和带恶意代码的 HTTP 请求,以探测网站是否存在防火墙,并识别防火墙的类型。
WAFW00F 怎么工作
发送正常的 HTTP 请求,然后分析响应,这可以识别出很多 WAF。
如果不成功,它会发送一些(可能是恶意的)HTTP 请求,使用简单的逻辑推断是哪一 个 WAF。
如果这也不成功,它会分析之前返回的响应,使用其它简单的算法猜测是否有某个 WAF 或者安全解决方案响应了我们的攻击
参数
它可以检测很多 WAF。想要查看它能检测哪些 WAF,以-l 参数执行 WAFW00F
命令:wafw00f 域名/IP

部分 bypass sqlinject payload
1 | id=1union/*%00*/%23a%0A/*!/*!select1,2,3*/;%23 |
案例演示
Sqlilabs-Less38-堆叠注入(多语句)
在执行select时的sql语句为:SELECT * FROM users WHERE id='$id' LIMIT 0,1
正常提交id值:

可以直接构造如下的payload:
1 | http://localhost/pentest/sqlilabs/Less-38/index.php?id=1';insert into users(id,username,password) values ('38','less38','hello')--+ |

再看数据表中的内容:可以看到less38已经添加

WAF部署-安全狗,宝塔等waf搭建部署
安全狗:📎safedogfwq_Windows_Help.pdf
宝塔:https://blog.csdn.net/weixin_43253175/article/details/105752439
以已经安装安全狗waf的sqlli-labs less2为例进行WAF绕过测试

直接输入payload会被拦截,无法注入

切换数据提交方式绕过WAF
使用post提交方式即可绕过(前提条件是源码支持该提交方式)

页面显示不正常,是因为本关代码只支持GET的提交方式,绕过思路是对的,但是在本关是无法成功的

如果将本关源码GET接收参数改为POST,在判断回显位时可以正常注入

在对回显位进行信息查询时,出现报错,是因为出现了过滤词database,是因为安全狗里面的漏洞防护规则里打开了防止查询数据库相关信息的规则


将该规则关闭之后可以正常注入

正常WAF是开着的,而且过滤提交参数的机制一般是使用正则表达式对敏感参数进行过滤,如果正则表达式匹配成功,则本次将无法成功提交。因此对提交数据做一些改动使其绕过正则表达式的匹配就是一种绕过WAF的思路。

而且本关提交database()会被匹配拦截,提交database、()不会被匹配拦截。再次开启WAF,针对拦截敏感数据,我们可以针对数据进行相关的编译。
MySQL的查询语句中出现/**/不会对语句执行造成影响,所以可以在database()字符串中加入一个/**/,即成为database/**/(),以绕过正则表达式的匹配。可以看到注入语句被成功执行。

将源码改回只允许GET方式提交参数
进行尝试,发现union不被拦截,select也不被拦截。而union select被拦截,说明是 union select关键词的问题。

原因是开启了拦截联合查询的规则

编码解码、注释符混用
使用%23 %0A
%23是#
%0A是一个换行符
原理
#是为了注释掉a ,使用%0A换行是为了将union和select连接起来。如果不换行的话union后面的#会将union后面所有的语句注释掉




参数污染
原理
/** */ 注释
语句没有执行




