网站建设毕业报告,现在建站好么,建立门户网站多少钱,苏州网络推广公司题目链接#xff1a;[GXYCTF2019]Ping Ping Ping
解题思路
访问靶机#xff0c;得到如下页面#xff0c;类似于URL参数 尝试用HackBar构造url传输过去看看 发现返回了ping命令的执行结果#xff0c;可以猜测php脚本命令是ping -c 4 $ip#xff0c;暂时不知道执行的函数…题目链接[GXYCTF2019]Ping Ping Ping
解题思路
访问靶机得到如下页面类似于URL参数 尝试用HackBar构造url传输过去看看 发现返回了ping命令的执行结果可以猜测php脚本命令是ping -c 4 $ip暂时不知道执行的函数时system()还是exec()但是大概能想到这题有命令执行漏洞那么我们就测试以下构建url?ip111;ls看看有没有目录文件返回 发现ls命令执行成功那么可以确定是命令执行漏洞且项目路径下还发现有flag.php我们尝试构造url来cat一下 发现回复fxck your space证明是有判断过滤了空格空格的作用一般是分隔关键字这时候就试试应对空格过滤的办法想办法识别关键字尝试了\${IFS}、%09、%0a都不行最后发现\${IFS}\$9可以绕过过滤 但是又发现flag字符串被过滤了那试试访问index.php页面发现可以访问也就是说没有被index.php没有被过滤 这时候我们可以看到index.php的内容就是正则过滤规则但是没有显示完全因为php代码是包裹在?php?块中HTML不认识该标签所以会把它们当作注释以上页面代码中缺失的部分按F12查看源码就可以发现index.php的源码如下
?php
//检查GET参数’ip‘是否存在
if(isset($_GET[ip])){$ip $_GET[ip];if(preg_match(/\|\/|\?|\*|\|[\x{00}-\x{1f}]|\|\|\|\\|\(|\)|\[|\]|\{|\}/, $ip, $match)){echo preg_match(/\|\/|\?|\*|\|[\x{00}-\x{20}]|\|\|\|\\|\(|\)|\[|\]|\{|\}/, $ip, $match);die(fxck your symbol!);} else if(preg_match(/ /, $ip)){die(fxck your space!);} else if(preg_match(/bash/, $ip)){die(fxck your bash!);} else if(preg_match(/.*f.*l.*a.*g.*/, $ip)){die(fxck your flag!);}$a shell_exec(ping -c 4 .$ip);echo ;print_r($a);
}
?我们可以从代码里发现flag的过滤规则任何含义flag的字符串都会被过滤那么我们如下以往的字符绕过技术都将不起作用
1.fl\ag使用反斜杠‘\’逃逸字符
2.flag双引号中断字符
3.flag重复双引号混淆过滤器
4.$afl;$bag;$a$b字符拼接
5:fla?通配符
6.fla通配符
7:fla[a-z]通配符在本题的规律规则下以上绕过均失效这块不行再利用其他方法如printf16进制和Base64编码解码绕过发现base64可行
?ip111;cat$IFS$9echo$IFS$9ZmxhZy5waHA|base64$IFS$9-d
解析
1、$IFS$9:环境变量代表内部字段分隔符$IFS$9实际上就是在命令中插入一个制表符以绕过过滤器分隔命令
2、echo$IFS$9ZmxhZy5waHA|base64$IFS$9-d
1反引号用于表示首先执行反引号中的命令并将其输出作为外部命令的一部分再执行外部命令。
2echo用于输出字符串
3ZmxhZy5waHA是flag.php的base64编码
4|管道符用于将前一个命令的输出作为下一个命令的输入
5base64 -d 解码一个base64字符串
3、最终命令执行效果ping -c 4 111;cat flag.php将构建好的url利用HackBar发送发现并没有显示 这里要知道php代码会被HTML解析成注释所以查看源码即可发现flag。
知识补充
正则表达式
一、/.*f.*l.*a.*g.*/ 通过匹配字符之间可以包含任意字符的形式来检查是否有类似于’flag’的字符串
.*这个部分匹配任意数量的任意字符除了换行符.*的意思是”零个或多个任意字符“首尾的/正则表达式分隔符用于表示开始和结束。但也可以用’#‘、’~来作为分隔符