目录
[极客大挑战 2019]EasySQL
确定该注入类型为字符型注入:
首先了解了一下sql注入的万能钥匙:
# 万能钥匙:
1 and 1=1
1' and '1'='1
1 or 1=1
1' or '1'='1
以第二个为例(1' and '1'='1)
如果是字符型的注入的话,输入第二个万能钥匙,构造的payload可能为:select *from table(某个表) where password = '1' and '1' = '1';
该查询语句值为:0,因为在sql语言中and两边都是true,结果才为true,or两边只要有一个是true,结果就是true,而且and的优先级高于or,两者碰到一起,先算and。
可以这样:
这样最终会让查询语句变为 false or false or true的结果,也就是true,就可以拿到flag了。
也可以这样:
直接把后面的password查询语句注释掉,然后通过构造username的payload来爆出所有信息,拿到flag.
[极客大挑战 2019]Havefun
启动靶机,出现一只猫,一般来说,像这种没有任何按钮然后也没有直接的代码提示的,我们需要看它的:1.URL ,2.网页源代码,
- 网站后台扫描(这个感觉有点陌生。)
查看网页源代码,可以发现最后有这么一段php代码:
上面说,如果让cat = dog,那么就会有{cat_cat_cat_cat}的回显,看起来很像flag。
$_GET是php中预定义系统变量,包含了通过get方式提交的信息。
我们先来了解一下什么是get请求:
get请求
get请求通常在URL的后面跟随一个问号(?),然后是请求参数的名称和请求参数的值,中间用(=)表示成对的关系,若有多个请求参数,则以&字符连接。使用get方法连接时,请求参数会出现在浏览器的地址栏。
<!--来自CSDN中“xhcoding”博主大哥的文章解释-->
//我感觉这里的请求参数应该就是php中的那个变量$cat吧。也就是通过URL的get请求来给$cat赋值(值为dog)。
最后我们在URL后面输入: /?cat=dog,即可爆出flag
[HCTF 2018]WarmUp
启动靶机,看到这个(笑死我了)
日常F12,查看页面源代码,发现了被注释掉的source.php
在顶部地址栏后拼接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,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_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'])
&& 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\" />";
}
?>
一句一句来分析,
//在上面几行,不仅看到了source.php,还看到了hint.php,我们在顶部地址栏拼接进去hint.php,可以看到如下字符:
它告诉我们,flag在ffffllllaaaagggg这个文件中,所以我们只需要将这个文件include就行了。
//highlight_file():这是PHP中的语法高亮函数,后面参数为
$filename:需要高亮显示内容的文件(必填参数)
$return: 布尔值参数,(可选参数)。默认值为false,如果修改为true,那么该函数将以字符串的形式返回。
//php中的function用法:用户自定义函数关键字(function),后面加函数名称(不能以$开头),参数,以及花括号括起来的函数内容,例如:
function cs( ){ },可以看到题目的函数名称为checkFile,参数为$page。
//$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
这是一个字符串数组,里面的两个值为"source.php"和"hint.php"。他们前面的那个是数组下标。
//接下来了解几个php中的字符串函数。
//substr()函数:(取子字符串)
substr(参数1,参数2[,参数3(不必选)])
参数1为:需要操作的字符串变量
参数2为:起始位置
参数3为:截取字符的长度(可有可无)
//注意:下标是从从0开始的!
<?php
$a = "I am a good boy";
print(substr($a,2,4)); //输出结果为 am a
?>
//isset()函数: 检查变量是否被初始化,如果被初始化,echo结果为1,如未被初始化,echo结果为空。
isset($a) ($a为需要检查的变量)
//is_string()函数:检查变量是否是字符串
is_string($a) ($a为需要检查的变量)
//in_array()函数:
in_array(参数1,参数2)
参数1为变量$a,参数2为某一个数组$arr,用于检查$a是否在$arr中
//mb_substr()函数:简单用法就是和substr()函数用法一样。
//mb_strpos()函数:用来查看某个字符或字符串在变量中第一次出现的位置:
<?php
$a = "I am a good boy";
echo mb_strpos($a,"good"); //结果为7
?>
<?php
$a = "good";
echo mb_strpos($a,"g"); //结果为0
echo mb_strpos($a."a","a"); //结果为4
?>
如图,$a."a"的意思就是在$a的后面加一个字符’a’。
//$_REQUEST:PHP中的超级全局变量,可以获取以post方法和get方法提交的所有数据。
//urldecode()函数:用于解码给出的已编码字符串。
//urlencode()函数:将字符串编码,并将其用于URL的请求部分(我感觉可能是post方法用的更多一点),同时可以用他来编码中文字符串,避免出错。
<?php
$a = "?";
echo urlencode(urlencode($a));
//结果为%253F,也就是?两次编码的结果
?>
/代表根目录
./代表当前所在目录
../代表上一层目录
代码审计:
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
只要我们传进去的file值不为空,且是字符串,最后能通过checkFile函数的验证,就可以包含我们传入的file文件()。
checkFile函数:基本需要满足的条件是:是字符串,并且是白名单数组里的字符,(内容经过解码后仍然数组中)。
mb_substr函数和mb_strpos函数可以让$_page 永远等于白名单里的那俩,从而能够return true,满足checkFile函数验证。
直接构造payload:?file=hint.php?./../../../../../ffffllllaaaagggg
拼接到URL后,即可得到flag
**:PHP中的include()函数可以跨目录包含!!
也就是我们先回退目录,然后直接访问ffffllllaaaagggg文件就行了!
参考博主:(讲的很好,比我好太多)
【HCTF 2018】WarmUp_阿哲也要努力学习!的博客-CSDN博客
[ACTF2020 新生赛]Include
启动靶机,可以发现一个“tips”点击进去,出现一段话:
Can you find out the flag?
日常F12也是什么都没有,那么flag很有可能就是被藏在了这个页面中,再结合题目中的“include”,可以推测这是一个文件包含漏洞。
我们只需在原URL后面拼接这样的字符串:
?file=php://filter/read=convert.base64-encode/resource=flag.php
输出一串base64编码的字符串,然后将其解码(网站 http://base64.wjccx.com很可行),我们便可以看到:
Flag得到!
//上面的php://filter其实是PHP的伪协议,。
read=<读链的过滤器> 比如上面就是由base64编码过滤的
source=<被过滤的文件> 上面flag.php就是被过滤的文件。