• Code-Audit(代码审计)习题记录


    介绍:

    自己懒得搭建靶场了,靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习,可以随地访问,本文所有的题目均来源于网站HSCSEC-Code Audit

    1、习题一 

    题目内容如下:

    1. 1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY=
    2. <?php
    3. error_reporting(0);
    4. require __DIR__.'/lib.php';
    5. echo base64_encode(hex2bin(strrev(bin2hex($flag)))), '
      '
      ;
    6. highlight_file(__FILE__);

     

    查看题目,发现是对$flag 参数进行了一系列加密,得到字符1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= 因此,如果要还原成flag 就必须对加密的字符串,一一解密。即 base64_decode() -> bin2hex()->strrev()->hex2bin()

    因此,撰写代码如下:

    1. $s = "1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY=";
    2. echo(hex2bin(strrev(bin2hex(base64_decode($s)))))
    3. ?>

    放在php 代码运行平台运行得到flag

    在线运行PHP

    flag{582a0f2c7e302244b110cc461f5cb100}

    2、习题二

    题目内容如下

    1. <?php
    2. error_reporting(0);
    3. require __DIR__.'/lib.php';
    4. if(isset($_GET['time'])){
    5. if(!is_numeric($_GET['time'])){
    6. echo 'The time must be number.';
    7. }else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){
    8. echo 'This time is too short.';
    9. }else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){
    10. echo 'This time is too long.';
    11. }else{
    12. sleep((int)$_GET['time']);
    13. echo $flag;
    14. }
    15. echo '
      '
      ;
    16. }
    17. highlight_file(__FILE__);

    分析代码后,发现,只有当传入参数time的值必须为数字,而且值的大小必须介于在60 * 60 * 24 * 30 * 2=5,184,000 和60 * 60 * 24 * 30 * 3=7,776,000之间,才能拿到flag,比如说6000000 但是这样就直接sleep 的三个月,恰好科学计数法 6000000= 6e6满足数据要求,而且只需要sleep 6秒即可,因此构造payload 如下

    ?time=6e6

    得到flag{yhngdasdaaljlj} 

    3、习题三

    题目内容如下:

    但是只是显示了这一个英文字母,查看一下源码,发现有一个index.txt

     访问一下index.txt,发现了代码

    1. error_reporting(0);
    2. echo "";
    3. require __DIR__.'/lib.php';
    4. if(!$_GET['id'])
    5. {
    6. header('Location: index.php?id=1');
    7. exit();
    8. }
    9. $id=$_GET['id'];
    10. $a=$_GET['a'];
    11. $b=$_GET['b'];
    12. if(stripos($a,'.'))
    13. {
    14. echo 'Hahahahahaha';
    15. return ;
    16. }
    17. $data = @file_get_contents($a,'r');
    18. if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
    19. {
    20. echo $flag;
    21. }
    22. else
    23. {
    24. print "work harder!harder!harder!";
    25. }
    26. ?>

    分析代码,首先初始化会跳转 index.php?id=1 然后 得到三个参数 id,a, b, 如果a的值包含有. 就输出Hahahahahaha,然后不含. 就得到内容定义参数为data 。

    如果data的值是1112 is a nice lab! 并且id==0 b 的值的长度大于5 ,eregi("111".substr($b,0,1),"1114") 用111拼接完b的值的第一个字母后的值在1114中 ,要么b的首个字符为4要么为空,并且b的第一个字母的值不能是4 那么只能为空,然后输出flag

    解法

    1、对于id 的值来说,是一个数字,有$id==0,这里利用弱类型比较可以传字符也可以用0e去绕过,为了使id==0可以给id一个字符 比如 id=abc

    2、对于b来说,如果b的第一个字符拼接完111后满足正则 1114 ,并且b的首个字符不能为4 ,因此可以用%00截断,因为 %00的长度为 1 所以b=%0012345 满足长度大于5

    eregi 函数在较旧版本的PHP中用于执行不区分大小写的正则表达式匹配。

    3、对于a来说,可以使用$a可以使用伪协议php://input也可以用data类型url$a=php://input   

    #然后POST一个内容为1112 is a nice lab!的body ,也可以使用 $a=data:,1112 is a nice lab!    #data类型url

    $a 使用data类型url 构造如下

    ?id=abc&a=data:,1112 is a nice lab!&b=%0012345

    flag{dsayandahckasda}

    使用伪协议php://input

    ?id=abc&a=php:%2f%2finput&b=%250012345

     

    flag{dsayandahckasda} 

  • 相关阅读:
    【Redis】Redis介绍
    Spring IoC源码:createBean(下)
    进程管理命令 动态监控进程 rpm yum
    Unbuntu系统下,切换python版本
    MySQL
    善网ESG周报(第一期)
    Unreal PythonScriptPlugin
    SAP S4 FI 后台详细配置教程文档 PART2 (财务会计的基本设置篇)
    【无标题】
    OpenGL入门(三)之着色器Shader
  • 原文地址:https://blog.csdn.net/shelbytt/article/details/136198802