欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MYSQL 堆叠注入详解

程序员文章站 2022-05-15 11:51:25
...

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

MYSQL 堆叠注入详解

堆叠注入,查询的前提是知道数据库名,表名等信息,而且如果执行任意语句,肯定是高权限,可以直接写shell

MYSQL 堆叠注入详解
MYSQL 堆叠注入详解

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')#

如图所示

MYSQL 堆叠注入详解

尝试寻找二次注入漏洞,构造payload如下

test';insert into users value('16',"admin'#",'123')#

登录admin‘#

MYSQL 堆叠注入详解

修改密码会对数据库操作,猜想使用的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注入

相关标签: SQL注入