这是我第一次在csdn上写文章,后面我将在这上面分享一些我个人的一些偏技术性的文章,本人web菜狗一枚还请大佬指教,最近在鼓捣我的博客网站,等备案好了还请捧个场
[HCTF 2018] warmup
打开一看,是一张图片,但是不知道为什么我没有加载出来,去网上搜了一下,这里其实就一张滑稽的图片,没啥用
按下Ctrl U查看源码发现存在一个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;
}
if (in_array($page, $whitelist)) { //判断变量是否在白名单里面有匹配的值
return true;
}
$_page = mb_substr( //问号?截取检测,若有变量中有问号就会截取问号前的字符串值然后赋给$_page,没有则将page的值全部赋给_page变量
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) { //再一次进行白名单检测,判断$_page是否在白名单中存在
return true;
}
$_page = urldecode($page); //对$page进行URL解码
$_page = mb_substr( //再一次进行问号截取赋值
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) { //再一次判断$_page是否在白名单中
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
其中: mb_substr(): 作用类似于substr()字符串截取的功能,只不过这个函数好像可以对中文字符串进行截取
语法:mb_substr(string , start , length ,encodinig)
string:将要截取的字符串
start:截取开始的位数,若为负数则从后往前数开始截取,若为0则是从第一位开始截取
length:可选。所要截取的长度,默认是截取的字符串末尾,若为负数则从字符串末端返回
encoding:可选。字符编码。如果省略,则使用内部字符编码
mb_strpos(): 作用类似于strpos(),即返回变量在某一字符串中最开始出现的位数
语法:strpos(string,find,start)
string: 必需。规定被搜索的字符串。
find: 必需。规定要查找的字符。
start: 可选。规定开始搜索的位置。
所以可以得出下面这串代码的作用
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
即对page变量进行从第0位到第mb_strpos( p a g e . ′ ? ′ , ′ ? ′ ) 位 进 行 截 取 , 而 m b s t r p o s ( page . '?', '?')位进行截取,而mb_strpos( page.′?′,′?′)位进行截取,而mbstrpos(page . ‘?’, ‘?’)的作用则是给变量结尾拼接一个’?’,然后再进行判断第一次出现问号的位数,很明显如果字符串中如果没有问号则返回该字符串原本的长度,截取出来的 p a g e 也 就 是 p a g e 本 身 , 若 如 果 _page也就是page本身,若如果 page也就是page本身,若如果page中本身就存在问号,那就则会返回问号前的字符串
通过这个理解我们就能利用问号进行截断,使得对include进行任意文件包含
这里还存在一个url二次解码的问题,但是我试了一下,就算他进行二次解码也不影响
我们通过访问hint.php知道了flag的位置在
所以直接开始构造payload:
POST: file=hint.php?../../../../../ffffllllaaaagggg //因为我们不知道flag的具体路径,所以只能通过../这个切换相对路径的方法一层一层得进行目录穿越,最终拿到flag
[极客大挑战2019] EasySql
首先进行burp抓包发现是一个get型的传参
然后尝试单引号拼接,发现存在注入点
后面尝试使用order by进行列数判断,发现
我把空格都替换成/**/,发现又能正常回显了,说明是过滤了空格
接着将空格全部替换掉之后进行爆列数,发现它居然直接就把flag爆出来了,不知道这是不是题的问题还是出题人故意这么设置的
payload:
?username=-1'/**/union/**/select/**/1,2,3%23
[极客大挑战 2019]Havefun
打开一看是一张很可爱的猫咪图片,查看源码可以发现
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
如果传入一个GET参数,且变量cat的值等于’dog’,就能输出flag,只能说with hands is ok