• buuctf web 前5题


    目录

    一、[极客大挑战 2019]EasySQL

    总结:

    二、[极客大挑战 2019]Havefun

    总结:

    三、[HCTF 2018]WarmUp

    总论:

    四、[ACTF2020 新生赛]Include

    总结:

    五、[ACTF2020 新生赛]Exec

    总结:


    一、[极客大挑战 2019]EasySQL

    EasySQL,根据题目盲猜是sql注的题目

    检查源码发现传参方式为GET

    随意输入用户名和密码,发现有回显

    预测后端代码应为:

    1. //连接mysql
    2. $servername="localhost";
    3. $username="root";
    4. $password="root";
    5. $dbname="mydata";
    6. .
    7. .
    8. .
    9. $username=$_GET['username'];
    10. $password=$_GET['password'];
    11. $sql=select * from users where username='$username' and password='$password';
    12. $ result=query($sql);
    13. .
    14. .
    15. .
    16. ?>

    根据数据库查询规则,使用万能密码

    admin ' or 1=1 #

    ps:select * from users where username='admin' or 1=1#' and password="";

    admin后的 ' :为了和前面的 ' 形成闭合

    or 1=1:形成查询永真条件

    #:将后面条件注释掉

    总结:

      sql注入万能密码:admin ' or 1=1 #

    二、[极客大挑战 2019]Havefun

    打开网址查看源码,发现一段注释的内容

    GET请求通过URL请求参数,可以在URL后面添加参数,以“?”作为分隔符,参数之间用“&”符号链接。

    解释:GET传参cat。输出cat。如果cat=dog。输出一串类似flag的东西。

    总结:

    GET请求通过URL请求参数,可以在URL后面添加参数,以“?”作为分隔符,参数之间用“&”符号链接。

    简单php代码。

    三、[HCTF 2018]WarmUp

    打开网址,检查以源码。发现隐藏页面source.php

    转到source.php可以看到一段php代码

    1. highlight_file(__FILE__);
    2. class emmm
    3. {
    4. public static function checkFile(&$page)
    5. {
    6. $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
    7. if (! isset($page) || !is_string($page)) {
    8. echo "you can't see it";
    9. return false;
    10. }
    11. if (in_array($page, $whitelist)) {
    12. return true;
    13. }
    14. $_page = mb_substr(
    15. $page,
    16. 0,
    17. mb_strpos($page . '?', '?')
    18. );
    19. if (in_array($_page, $whitelist)) {
    20. return true;
    21. }
    22. $_page = urldecode($page);
    23. $_page = mb_substr(
    24. $_page,
    25. 0,
    26. mb_strpos($_page . '?', '?')
    27. );
    28. if (in_array($_page, $whitelist)) {
    29. return true;
    30. }
    31. echo "you can't see it";
    32. return false;
    33. }
    34. }
    35. if (! empty($_REQUEST['file'])
    36. && is_string($_REQUEST['file'])
    37. && emmm::checkFile($_REQUEST['file'])
    38. ) {
    39. include $_REQUEST['file'];
    40. exit;
    41. } else {
    42. echo "
      "
      ;
    43. }
    44. ?>

    先来查看一下,hint.php里的内容

    ffffllllaaaagggg这里flag被复写了四次,可以猜测flag被放在4到5个根目录下,即写成../../../../ffffllllaaaagggg或../../../../../ffffllllaaaagggg

    再对上面php代码进行逐行分析:

    1. highlight_file(__FILE__);
    2. class emmm
    3. {
    4. public static function checkFile(&$page)
    5. //创建一个函数
    6. {
    7. $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
    8. //增加白名单,包含source.php和hint.php
    9. if (! isset($page) || !is_string($page)) {
    10. //$page不为空或NULL(!isset($page))或(||)不为字符串(!is_string($page))
    11. echo "you can't see it";
    12. return false;
    13. }
    14. if (in_array($page, $whitelist)) {
    15. //in_array的意思是判断page里是否包含白名单里的内容,即是否包含(source.php或hint.php)
    16. return true;
    17. }
    18. $_page = mb_substr(
    19. $page,
    20. 0,
    21. mb_strpos($page . '?', '?')
    22. );
    23. /*这里mb_substr返回字符串的一部分
    24. mb_substr(需返回字符串(类型:sting),从哪个数字代表的位置开始(类型:int),截取长度(类型:int))
    25. mb_strpos(要被检查的字符串,要搜索的字符串)最终返回要被检查字符串的位置(类型:int)
    26. 综合来看就是mb_strpos函数,检索$page中?的位置,并返回?所在的位置数,mb_substr函数将从0开始,到?位置的$page字符串返回到型变量$_page*/
    27. if (in_array($_page, $whitelist)) {
    28. return true;
    29. }
    30. /*in_array(被搜索的值,搜索的数组,类型)
    31. 经过上面的截取代码,$_page是否存在source.php或hint.php,如果存在就返回true*/
    32. $_page = urldecode($page);
    33. /*进行一次url解码,将%3F解码为?
    34. 所以这里将?写做%3F也无法实现绕过*/
    35. $_page = mb_substr(
    36. $_page,
    37. 0,
    38. mb_strpos($_page . '?', '?')
    39. );
    40. if (in_array($_page, $whitelist)) {
    41. return true;
    42. }
    43. //这一部分解释同上
    44. echo "you can't see it";
    45. return false;
    46. }
    47. }
    48. if (! empty($_REQUEST['file'])
    49. //判断文件不能为空
    50. && is_string($_REQUEST['file'])
    51. //并且,传入参数为字符串
    52. && emmm::checkFile($_REQUEST['file'])
    53. //并且,调用函数(白名单)要过白名单检测,过了之后,即可看到包含了flag的文件
    54. ) {
    55. include $_REQUEST['file'];
    56. exit;
    57. } else {
    58. echo "
      "
      ;
    59. }
    60. ?>

    构造playload(1)=http://ip/?file=souce.php?../../../../ffffllllaaaagggg

            playload(2)=http://ip/?file=souce.php?../../../../../ffffllllaaaagggg

            playload(3)=http://ip/?file=hint.php?../../../../../ffffllllaaaagggg

    分别进行尝试

    (中间有靶机到期自动销毁的情况,截图的网址有变化)Q^Q

    总论:

    mb_strpos和mb_substr截取内容,碰到?就截止,所以我们只需要输入/?file=source.php?即可绕过白名单检测

    四、[ACTF2020 新生赛]Include

    进入网页,打开源码,只有tips有提示

    点击tips,跳转到/?file=flag.php,还是什么也没有

    根据题目(include)提示,可以猜测flag在/?file=flag.php页面中,但是被注释了,所以我们就要想办法获取网页的源码。

    所以这里可以想到要构造php伪协议

    PHP伪协议也是php支持的协议和封装协议。

    常见的有

    1. file:// 访问本地文件系统
    2. php:// 访问各个输入/输出流
    3. data:// 数据
    4. zip:// 压缩流 不过有些伪协议需要allow_url_fopen和allow_url_include的支持

    php://

    • php:// 访问各个输入/输出流I/O streams在CTF中经常使用的是php://filter和php//input
    • php://filter用于读取源码php://input用于执行php代码。

    php://filter伪协议
    php://filter/参数=转换过滤器
    参数:
    1.resource=<要过滤的数据流>
    2.read=<读链的过滤器>
    3.write=<写链的过滤器>
    4.<;两个链的过滤器>

    转换过滤器:
    1.convert.base64-encode & convert.base64-decode<等同于base64_encode()和base64_decode(),base64编码解码>
    2.convert。quoted-printable-encode & convert.quoted-printable-decode

    php://input读取POST数据
    说明
    可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的

    参数可以同时使用,两两之间使用 / 隔开

    本题构造的伪协议格式:

    /?file=php://filter/read=convert.base64-encode/resource=flag.php

    得到一串base64编码

    将base64编码解码

    总结:

    php伪协议,获取网页源码,用于获取简单的被注释掉的重要信息

    伪协议构造格式中的一种:

    /?file=php://filter/read=convert.base64-encode/resource=flag.php

    五、[ACTF2020 新生赛]Exec

    打开靶机看到ping,先输入网址127.0.0.0进行测试

    可以看到执行ping命令有回显

    而单独输入查询命令时没有回显,由于ping命令可以与管道符连用,先尝试用管道符连接ls

    连接ls发现有回显,尝试用cd逐层发打开文件

     

    打开到第三层的时候,出现了flag,我们只要cat一下flag即可 

    既然ls命令可以用,我们不妨大胆一点

    直接cat /flag

    嚯!这也行!直接一步到位,所以我前面在干嘛……

    ps:补充一下管道符的用法

    | :按位或,直接执行后面的语句

    & :按位与,前面后面的都要执行,不管真假

    || :逻辑或,相当于or

    && :逻辑与,相当于and

    ; :作用与&相同,前后都会执行

    总结:

    ping命令后可跟管道符,管道符的用法。

  • 相关阅读:
    vue多条件查询
    【k8s实战】kubeasz离线部署多master高可用集群
    SpringCloud-alibaba-Sentinel入门到精通
    SaaSpace:8种最佳免费社交媒体监控软件工具
    初赛错题集
    台式电脑怎么无损备份迁移系统到新硬盘(使用傲梅,免费的就可以)
    Clickhouse 使用DBeaver连接
    leetcode算法题--数值的整数次方
    【学习方法】学得差分数低?你掉进了这个学习陷阱!这个跳坑指南,让你高效学习,学习效率超级加倍!
    intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法
  • 原文地址:https://blog.csdn.net/m0_61903191/article/details/132699431