WEB攻防-代码特性
WEB攻防-代码特性
重要思路
判断网站是由什么编程语言进行搭建(如何进行判断)
从编程语言的特性找出漏洞(每个语言的弱点在哪里)
ASP
如何判断网站搭建是否是asp
-
查看URL后缀:ASP网站的URL后缀一般是.aspx,而PHP网站的URL后缀一般是.php。如果网站的URL中包含.aspx后缀,则可以判断它是使用ASP搭建的;如果URL中包含.php后缀,则可以判断它是使用PHP搭建的。
-
查看网页源代码:打开网站的任意页面,在浏览器中点击右键,选择“查看网页源代码”(或类似选项),打开页面的HTML源代码。在源代码中搜索关键字“ASP”或“PHP”,如果能够找到,就可以确定网站使用的是相应的语言。
-
查看HTTP响应头:使用浏览器的开发者工具(如Chrome的开发者工具)打开网站的任意页面,在“Network”(网络)选项卡下刷新页面。选择第一个请求,并查看其“Response Headers”(响应头)部分。找到“X-Powered-By”或“Server”字段,如果它的值是“ASP”或“ASP.NET”,则表示网站使用的是ASP;如果值是“PHP”,则表示网站使用的是PHP。
-
尝试访问不存在的页面:在浏览器地址栏中手动输入一个不存在的页面,比如http://www.example.com/test123456.aspx或http://www.example.com/test123456.php。根据出现的错误页面或错误信息,可以推断网站使用的是ASP还是PHP。
ASP常见的搭配组合
Windows iis asp access(SQL\SQLserver)
ASP语言的漏洞点(从哪一方面入手)
ASP-数据库-MDB下载
Access数据库一般后缀名为asp asa mdb(下载)
asp asa会被执行解析
mdb在网站的目录下:
思路:如果知道数据库的地址,并可以进行下载获取数据库文件,即可获取当前管理员的账号密码
找mdb文件:
- 网站地址扫描(工具)
- 默认数据库配置
- 网站寻找开源源码,自己对其网站进行配置了解网站文件结构
ASP-数据库-ASP后门植入链接
使用浏览器查看数据库文件,后缀为.asp,当进行访问的时候会直接以asp的形式进行执行
因此可以留下asp木马payload,借用网站解析.asp文件进行攻击
(前提:网站有交互的地方)
原因:数据库后缀为.asp文件,所以当我们留言时,数据会存储到数据库里,.asp是直接执行的,所以当我们植入一个木马向数据库时,数据库会以.asp形式将此木马直接执行。
ASP-中间件-IIS短文件名探针-安全漏洞
IIS:提供可扩展的web服务器
利用 iis_shortname_Scan.py target
对其进行短文件名扫描,只能看到前6位,后面可以猜解
方便观察后台文件
目录扫描是借助与字典,而这个是借助于IIS
ASP-中间件-IIS文件上传解析-安全漏洞
针对文件上传:
流程:发现网站存在上传点–上传asp木马–若存在文件名监测通过修改文件类型绕过检测–shell工具连接
例:1.jpg文件无法解析,修改为1.asp;.jpg即可绕过。或者1.jpg文件放在a.asp文件下也可进行解析
通过文件名为a.asp,里面的1.jpg由1.asp组成,因为识别为.asp文件,所以会将1.jpg里的代码进行实现
ASP中间件-IIS配置目录读写-安全配置
这个的前提下是需要网站的读写权限开启
此时才会出现写入漏洞
通过工具可以得到漏洞存在YES表存在
总结
目前asp搭建的网站并不多,首先还是先判断是不是为asp搭建的网站,对于asp可搭配组合的数据库的特性,进行数据库弱点的攻击,对于asp网站对于asp文件的解析进行文件上传获取shell,也可以进行中间件iis的配置弱点进行攻击(这个需要网站设计者的粗心导致,一般不会出现)
ASPX
ASPX没有特性的漏洞 .NET发布平台是微软官方,所以基本上都是在Windows上的,如果是web应用的话,就会存在基本存在的windows自带的中间件平台,比如iis(在这里上述的asp的iis中间件漏洞)
共性漏洞
- 未授权访问漏洞
- 本身源码的结构的漏洞(和java有点类似)开发初衷就是为了和java对抗市场终端。在开发程序代码的时候都会进行封装,在caessup里面开发,经常会把他封装成dll的动态链接库文件;java里面则会将其封装成jar包。这两者都存在一个共同特点,即封装进去之后都会存在一个反编译的过程。我们如果需要得到其真实代码就需要反编译。
如何判断网站搭建是否是ASPX
和上述判断的方法一致,在这里主要测试的.NET的漏洞
ASPX语言常见的搭配
.NET:Windows+iis+aspx+sqlserver
IIS上的安全问题也会影响
WEB漏洞:本身源码上的问题
服务漏洞:中间件 数据库 第三方软件
.NET的漏洞点(从哪一方面入手)
.NET项目-DLL文件反编译指向-代码特性
网上会有很多这种.net源码下载站点 可以在网站搜索下载看看源码什么情况(和java相似,会有包文件)
主要观察源码和asp php有什么不同之处
.net代码并不能直接查看,属于一个框架,需要反编译来查看真实的源代码
里面会出现很多aspx文件和config文件
bin目录下会存放可执行的dll文件(关键代码被封装在dll文件中,需要反编译才能看到里面的内容)
反编译查看源代码(F12)所指向的核心源文件(反编译)
反编译工具:ILSpy
在这里可以进行代码审计
.NET项目-Web.config措误调试信息泄露
关于源码Web.config一般都是网站的配置文件
其中有一行代码customErrors mode='off'
(在这里不是每个web.config都会有)
在开发过程中,设计者需要经常实验功能是否正常,在这里一般会处于off状态,这样设计者会清晰知道程序运行过程中出现的报错。当程序测试结束后,设计者会让处于on状态,当程序错误运行便设计回显,保证源码安全
比如出现错误在配置文件的 ="on"时//关闭自定义错误时
当网站报错的时候,就会泄露哪里代码出问题,导致代码和文件路径泄露
.NET项目-身份验证未授权访问安全漏洞
aspx容易出现未授权访问,是基于语言本身特性所决定的
未授权访问
判断用户身份:
由于后台本身有多个功能文件页面
- 在每个文件里面添加判断代码
- 创建一个文件专门来判断,其它文件包含调用它
找未授权访问
- 找文件没有包含验证代码文件
- 验证代码文件有没有可以绕过
PHP
PHP中更多的是PHP函数带来的逻辑漏洞,在这里主要是缺陷函数,在CMS审计中和CTF题目中经常出现
== 与 ===
==
:弱类型对比(不考虑数据类型),甚至可以理解为只要右边变量的前几个字符或数字等于左边的变量,==
就成立,且不受符号影响。===
:强类型对比(考虑数据类型),也就是说左右两边的值要完全一样才会满足===
。
<?php
header("Content-Type:text/html;charset=utf-8");
$flag='flag{666666}';
//1、== ===缺陷绕过 == 弱类型对比 ===还会比较类型
$a=1;
if($a==$_GET['x']){
echo $flag;
}
//1.0 +1 1a(都可以返回flag)
$a='1';
if($a===$_GET['y']){
echo $flag;
}
//1.0 +1 1a(类型不一致)
md5
使用md5()
和==
进行变量比较
md5 0e
漏洞:就是说在使用md5()
和==
进行变量比较的时候,只要左右两边的字符串经过md5()加密后,都是以0e
开头的字符串,那么左右两边将会相等。
当使用md5()
和===
进行变量对比的时候, 使用数组可以绕过md5()函数的检测。
//2、MD5函数缺陷绕过 ==弱对比 ===强类型对比
if($_GET['name'] != $_GET['password']){
if(MD5($_GET['name']) == MD5($_GET['password'])){
echo $flag;
}
echo '?';
}
//==
//echo MD5('QNKCDZO');
//echo MD5('240610708');
//===
//name[]=1&password[]=2
intval
函数作用:将变量的值默认转化为十进制。intval
应用地方:比如sql注入时,通常使用and 1=1
来判断注入类型是数字型还是字符型,后端使用intval()
函数将会使and 1=1
失效。
缺陷:可以使用==
的特性,如+16、16.0;或者进制转换后,左右变量也相等。intval绕过
//3、intval缺陷绕过
$i='666';
$ii=$_GET['n'];
if(intval($ii==$i)){
echo $flag;
}
// 666.0 +666
$i='666';
$ii=$_GET['n'];
if(intval($ii==$i,0)){
echo $flag;
}
//0x29a
strpos
函数语法:第一个参数为要搜索的字符串,第二个参数为要查找的子串,第三个参数为从哪儿开始查找。
%oa
(换行)不会影响搜索的子串。
过滤字符串起始不能为0,起始为0,那么函数的结果就是在第0位置找到了要匹配的字符。
//4、对于strpos()函数,我们可以利用换行进行绕过(%0a)
$i='666';
$ii=$_GET['h'];
if(strpos($i,$ii,"0")){
echo $flag;
}
//?num=%0a666
in_array
函数用于在数组中搜索指定的值,并返回一个布尔值表示是否找到该值
语法:bool in_array (mixed $needle, array $haystack [, bool $strict = FALSE])
不设置strict
参数,就相当于==
进行判断。
//5、in_array第三个参数安全
$whitelist = [1,2,3];
$page=$_GET['i'];
if (in_array($page, $whitelist)) {
echo "yes";
}
//?i=1ex
preg_match
漏洞:preg_match
只能处理字符串,如果不按规定传一个字符串,通常传一个数组进入,就会使preg_match
失效,从而绕过该函数的检测。
//6、preg_match只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
x//?num[]=1
str_replace
作用:替换字符串中的一些字符(区分大小写)。
//7、str_replace无法迭代过滤
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;
//?s=sselectelect
?>
JAVA
JAVA中常见的安全漏洞
目录遍历
路径(目录)遍历是一种漏洞,攻击者可以在其中访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件,并且如果是文件 上传覆盖关键系统文件。
它是如何工作的?
例如,假设我们有一个应用程序,它托管了一些文件,可以在以下内容中请求它们 格式:现在,作为攻击者,您当然对其他文件感兴趣 你试试.在本例中,您可以尝试走到文件系统的根目录 然后进入以获取对此文件的访问权限。这被称为点-点-斜杠,这是另一个名字 对于这次攻击。http://example.com/file=report.pdf``http://example.com/file=../../../../../etc/passwd``/etc/passwd``../
当然,这是一个非常简单的例子,在大多数情况下,这不能作为框架实现的控制 因此,我们需要在将请求发送到服务器之前获得更多的创意并开始编码。 例如,如果我们对 URL 进行编码,您将得到并且接收此请求的 Web 服务器将进行解码 它再次到 .../``../``%2e%2e%2f``../
另请注意,避免应用程序过滤这些编码的双重编码也可能有效。双重编码 如果您有一个调用系统 B 的系统 A,则可能需要,系统 A 只会解码一次,并且 将使用仍编码的 URL 调用 B。
目录遍历及穿越
这个不算Java代码的特性漏洞,都存在。
常见在上传的功能点上,利用场景适用于只允许上传图片,且图片目录没有解析权限,可以通过跳转到上一级目录或者网站根目录从而解析后门。配合目录跳跃获取敏感信息
白盒测试客户端传递的参数是否存在过滤../../
身份验证
身份验证绕过
身份验证绕过以多种方式发生,但通常会利用配置或逻辑中的某些缺陷。篡改以达到正确的条件。
隐藏输入
最简单的形式是对网页/DOM 中的隐藏输入的依赖。
删除参数
有时,如果攻击者不知道参数的正确值,他们可能会从提交中完全删除该参数,以查看会发生什么。
强制浏览
如果站点的某个区域未通过配置正确保护,则可以通过猜测/暴力破解访问该站点的该区域。
身份验证中,存在一个问题对应一个键值对。
比如s0----你最喜欢的老师叫什么名字
s1----你长大的街道叫什么名字
代码逻辑,通过对应键值对,第一个问题的答案进行验证是否正确,第二个问题的答案进行验证是否正确
但如果在这里,修改成两个不存在的键值对,相应的对应的为空进行验证也能成功
JWT全称为Json Web Token,它遵循JSON格式,将用户信息加密到token里,服务端不保存用户信息,只保存密钥信息。在收到客户端的token后,使用密钥对加密后的token进行解密以验证用户身份。JWT原理及常见攻击方式
如何判断网站是否使用JWT呢? burp抓包,在cookie字段会看到JWT特有的三段式字符串,分别为header.payload.signature
JWT攻击方式
1、签名没验证空加密 2、爆破密匙 3、KID利用
空加密算法
#前提:服务端允许使用"alg" : "None"(几乎不可能,一般只存在靶场中)
#方法:将header部分的alg改为None,删除掉Signature部分
#脚本:
import jwt
import base64
def b64urlencode(data):
return base64.b64encode(data).replace(b'+', b'-').replace(b'/', b'_').replace(b'=', b'')
print(b64urlencode(b'{"alg":"None"}')+b'.'+b64urlencode(b'{"iat":1669649048,"admin":"true","user":"Tom"}')+b'.')
爆破脚本跑出密钥
工具:GitHub - brendan-rius/c-jwt-cracker: JWT brute force cracker written in C
设置第一个JWT的密钥为bcxc,第二个JWT的密钥为jwt
相关文章
JWT原理及常见攻击方式 - 掘金 (juejin.cn)
相关工具
安全问题-访问控制&安全组件-第三方组件
Java开发的应用程序本身的安全性是很不错的,但是由于语言强大,往往都会包含很多第三方的库。这些库会给开发带来便捷且强大的功能,但是往往java应用的安全问题也是这些库爆出来的。当第三方库产生安全问题时,该应用也会受到影响,如前端时间爆出的1og4j2的rce。1og4j本来是一款优秀的日志分析组件,但是后面爆料出存在安全问题
后,使用该组件的应用也受到牵连。
环境下载
JavaScript
什么是JS渗透测试?
在JavaScript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞
JS开发的WEB应用和PHP,JAVA,NET等区别在于即没有源代码也可以通过浏览器查看源代码获取真实的点,相当JS开发的WEB应用属于白盒测试(默认有源码参考)
流行的JS框架有哪些?
- React.js:由 Facebook 推出的一款用于构建用户界面的 JavaScript 库,被广泛应用于 Web 应用和移动应用的开发。
- AngularJS:由 Google 开发的一款用于构建 Web 应用的 JavaScript 框架,采用 MVC 模式,已有较长历史,并积累了大量的社区资源。
- Vue.js:一款轻量级、灵活的 JavaScript 框架,易于上手和学习,适合构建交互性强的界面。(最常见)
- Ember.js:一款面向 Web 应用开发的 JavaScript 框架,提供了一整套开发工具和库,帮助开发者构建高性能的 Web 应用。
- Svelte:一款编译型的 JavaScript UI 框架,通过在构建时将组件转换为纯粹的 JavaScript 代码,提供了高性能的界面渲染和更小的包大小。
- Backbone.js:一个比较老牌的 JavaScript 框架,提供了模型、视图、集合等组件,帮助开发者构建结构清晰的 Web 应用。
- Meteor:一个面向全栈开发的 JavaScript 框架,提供了一整套的开发工具,包括数据库管理、服务器端和客户端代码等,帮助开发者快速构建现代 Web 应用程序。
如何判定JS开发应用?
- 插件wappalyzer
- 源代码简短
- 引入多个js文件
- 一般有/static/js/app.js等顺序文件
- cookie中有connect.sid
如何获取更多的js文件?
- JsFinder
- packer-Fuzzer
- 扫描器后缀替换字典
如何快速获取价值代码?
- method:"get"
- http.get("")
- method:"post"
- http.post("")
- S.ajax
- service.httppost
- service.httpget
常见安全问题-前端验证&未授权
JavaScript最主要的一点是可以根据源代码审计寻找漏洞
前端验证更多的是未授权访问,比如通过修改前端状态码进行绕过未授权访问
Python
PYC文件
这一部分实战中基本不会遇到,只有在CTF比赛中才会得到PYC源文件
pyc文件是文件编译后生成的字节码文件(byte code),pyc文件经过python编辑器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后,都会重新生成pyc文件
真题附件:
http://pan.baidu.com/s/1jGpB8DS
反编译平台:
在线pyc,pyo,python,py文件反编译,目前支持python1.5到3.6版本的反编译-在线工具 (bugscaner.com)
反编译工具:
SSTI
实战或者CTF中模板注入
模板渲染接受的参数需要用两个大括号括起来{{}}
,所以我们需要在大括号内构造参数形成注入
__dict__ :保存类实例或对象实例的属性变量键值对字典
__class__ :返回一个实例所属的类
__mro__ :返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__bases__ :以元组形式返回一个类直接所继承的类(可以理解为直接父类)__base__ :和上面的bases大概相同,都是返回当前类所继承的类,即基类,区别是base返回单个,bases返回是元组
// __base__和__mro__都是用来寻找基类的
__subclasses__ :以列表返回类的子类
__init__ :类的初始化方法
__globals__ :对包含函数全局变量的字典的引用__builtin__&&__builtins__ :python中可以直接运行一些函数,例如int(),list()等等。 这些函数可以在__builtin__可以查到。查看的方法是dir(__builtins__) 在py3中__builtin__被换成了builtin 1.在主模块main中,__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__。 2.非主模块main中,__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身
参考链接:
1. SSTI(模板注入)漏洞(入门篇) - bmjoker - 博客园 (cnblogs.com)
2. SSTI(模板注入)漏洞(cms实例篇) - bmjoker - 博客园 (cnblogs.com)
什么是SSTI?有什么漏洞危害?
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、getshell等问题。其影响主要取决于模板的复杂性
如何判断检测SSTI漏洞的存在?
输入的数据会被浏览器利用当前脚本语言调用解析执行
SSTI会产生哪些语言开发应用
1、Python: 使用像Jinja2、Mako、Django等模板引擎的Python Web应用程序容易受到SSTI攻击。这些框架在处理用户输入时,如果不正确地进行了过滤或者模板渲染不安全,就容易受到攻击。
2、Ruby: Ruby on Rails框架使用ERB(Embedded Ruby)作为默认的模板引擎,如果开发人员未正确处理用户输入,就可能导致SSTI漏洞。
3、Java: 基于Java的Web应用程序通常使用像FreeMarker、Thymeleaf等模板引擎。如果这些模板引擎未受到适当的保护或者没有正确地过滤用户输入,就可能受到SSTI攻击。
4、JavaScript/Node.js: 一些Node.js应用程序使用像Handlebars、Pug等模板引擎。如果这些模板引擎在处理用户输入时不安全,就可能存在SSTI漏洞。
SSTI安全问题在生产环境哪里生产?
存在模板引用的地方,如404错误页面显示
存在数据接收引用的地方,如模板解析获取参数数据