小言_互联网的博客

MYSQL 堆叠注入详解

445人阅读  评论(0)

堆叠注入与受限于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注入


转载:https://blog.csdn.net/weixin_45146120/article/details/101037211
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场