月度归档:2013年08月

浅谈 utf-7 在Ie浏览器的魔术效果

0x01 utf-7简介

我不会告诉你那些枯燥的介绍(如果你想,请自行google)。

比如XSS 跨站可能用到的字符 ” < “、” ” “ ,即小于号 和双引号(我们把这2个字符的其中一个转换成utf-7字符)

我们首先把小于号也就是< 转换为 16进制 => 0x003c

然后换算成2进制 0000 0000 0011 1100

然后组合2进制的位数,以6个为一组,进行组合,少则后面补0

000000 000011 110000

接着 000000 为 A字符 超过26个大写字母,就以小写字母开头 a字符

所以上面3组 分别为 ADw

0x02 utf-7的实际效果

<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-7">
</head>
<body>
<div>
  +ADw-script+AD4-
    alert( document.cookie );
  +ADw-/script+AD4-
</div>
</body>
</html>

上面的ADW 字符就是我们说的<字符 同理 AD4也就是>字符,在IE9浏览器可以运行,火狐测试运行不了.

0x03 总结

经过测试,我发现如果以下代码,未指定charset或者content 没有

<meta http-equiv="content-type" content="text/html;charset=utf-7">
 
<-- 第一种情况
<meta http-equiv="content-type" content="text/html;">
-->
 
<-- 第二种情况
<meta http-equiv>
-->

以上2种情况 都攻击不了(可能我们默认的字符集是gbk与国外某些默认的字符集不一样),所以设置好charset 就可以防止此类攻击的发生。

浅谈SQL注入攻击技巧

0x01 你要知道目前有哪些数据库

微软公司旗下的:

Microsoft SQL server 简称 MS-SQL 或者 SQL SERVER (大型数据库操作,功能和性能异常强大)(一般也是ASP或者ASP.NET)

access,微软Office系列产品之一,极小型数据库。功能和性能当然也是相当一般。性能甚至可以说是相当低(常与ASP应用交互)

Oracle公司旗下的:

MySQL 是一个关系型数据库管理系统(常与PHP web应用交互)

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统

0x02 判断你的web应用是什么类型的数据库

//大家有兴趣,可以自行google,我只列举最常见的
(在可注入的情况下,判断数据库类型)(我以数字型注入为例子)

单引号判断:

id=1’页面出现类似错误显示 “Microsoft JET Database Engine 错误 ‘80040e14′” JET 为ACCESS数据库
id=1’页面出现类似错误显示 “Microsoft OLE DB Provider for sql server错误 ‘xxxxxx’ ” 就为MSSQL数据库

条件判断:
id=1 and user>0 出错爆出user用户名的是 MSSQL

如果不爆错,那么我们用以下方式

id=1 and (select count(*) from sysobjects)>0 访回与id=1时页面一样 就为MSSQL数据库

id=1 and (select count(*) from msysobjects)>0 access会返回你没有权限查看

如果也没反应怎么办?

那我们就盲注吧

mysql 盲注语句为 id=1 and if(1=1,benchmark(100,md5(1)),0) //如果可延时执行,为Mysql数据库
mssql 盲注语句为 id=1 and if(1=1) waitfor delay ’00:00:04′;

0x03 针对数据库类型,进行相应的SQL注入攻击

看了下面的文章,你可能知道为什么要分析是web应用是什么数据库啦:)

如果你分析为 MYSQL 注入,我推荐你看这篇文章。

http://websec.ca/kb/sql_injection#MySQL_Default_Databases

如果你分析为 MSSQL 注入,我推荐你看这篇文章。

http://websec.ca/kb/sql_injection#MSSQL_Default_Databases

如果你分析为 ORACLE 注入,我推荐你看这篇文章。

http://websec.ca/kb/sql_injection#Oracle_Default_Databases

算是一个科普文章(请勿利用你学到的知识,做违反法律的事情,一切后果自己自负)

利用html5 canvas标签破解验证码 —待完善

0x00 思考

验证码破解第一步 识别图像的尺寸

<script>
function test(image_data){
 alert('宽度'+image_data.width+'高度'+image_data.height);
}
var img=new Image();
 
img.onload=function(){
	 test(img);
};
img.src="1.jpg"; //我是本地图片,你也可以放网络图片的
</script>

验证码破解第二步 把图片放到画布里去
将上面代码做以下改进

<canvas id="myCanvas">your browser does not support the canvas tag </canvas>
<script>
function test(image_data){
 var cav=document.getElementById("myCanvas"); //获取canvas的元素对象
 var ctx=cav.getContext("2d"); 
 ctx.drawImage(image_data,0,0); //把image_data图像显示在画布上
}
var img=new Image();
 
img.onload=function(){
	 test(img);
};
img.src="1.jpg"; //我是本地图片,你也可以放网络图片的
</script>

验证码破解第三步 分析验证码图片
啊啊啊,拖延症好严重啊,肿么办啊- –
1.验证码图片的底色是否会随机更换
2.验证码图片里面的字符位置是否一致(比如abcd字符串第一次居中,第二次跑到最右边,或者是居中)
3.验证码图片的字符颜色与底色像素值是否在一个很小的区间
4.字体是什么字体

当然还有更复杂的验证码,不在本文的讨论范围内.
我们就说说 最简单的验证码识别吧 – –
底色白色、字符颜色为黑色、字体正常的、字体居中。(假设验证码是数字)
要识别图片的数字可以把图片的4个数字,分层4块,然后每块根据像素点的值,猜解数字。思路清楚了,我们开始猜解之旅吧

验证码破解第四步 猜解数字

…. 留到下次写
最近开发有点忙不好意思啊,文章更新有点慢啊- –

浅谈我公司对安全应急的响应

0x00 黑客来了

公司对黑客进行的攻击的应急处理还是很欠缺的,发现有安全问题的,往往是客户(也是受害者)因为客户发现自己的数据被更改了,然后投诉到公司说数据什么被恶意更改的问题吧。然后公司的运维人员就查下数据库里面的信息,发现有JS代码(经过特殊处理的js代码)插入到数据库里。(公司一般被XSS攻击的太多了,感觉应急处理太被动了,客户要是第一次肯定觉得可以原谅下,但是要是下次,多次被更改,我感觉客户不会在爱了…由于我在该公司是做PHP开发,所以没能真正的应急处理。我接下来做到事就是 找原因对症下药治好它,也就是我PHP开发人员该干的)

0x01 黑客的攻击方法分析

黑客既然已经来了,我们就要分析那段js代码是如何绕过我们公司的xss过滤的(以便做好相应的修复方法),我如果不说那黑客是怎么绕过XSS过滤的,你们肯定觉的我这文章写的没意思,扯淡的。我就大概说下那黑客是怎么绕过的,html的img标签的属性比如src属性没错我想你应该猜到了,那位黑客是绕过了这个属性内的双引号控制,进而增加个onerror属性,导致XSS,其实公司这块是有过滤的,由于还有其他部分的过滤替换(关键就是这个替换太扯淡了,更扯淡的是过滤方法 都是写在js端里- -(写在服务端会死啊),黑阔都可以看见我们的过滤方法,进行白盒审计下就可以发现替换处有漏洞),原因找到了,那么我们就可以进行修复了。。。

0x02 总结

1. 运维部门没有良好的日志查看习惯,导致被黑客攻击了暂时不知道。
2. 恶意代码过滤方法写在服务端的话,黑客就不知道其过滤方法,只能慢慢测试,测试过程中会留有日志,这样查看日志还是有效果的。
3. 恶意代码快速从数据库里删除

目前只是这些,如果不足,欢迎大家补充。。。

JS安全开发那些事—待完善

jquery框架

jquery中的 $(“x”).html(变量); //如果变量可控,可能会导致XSS、XSIO、CSRF、黑帽seo 等等

js dialog对话框

art.dialog({title:变量,content:变量}); //我在网上看过某些程序的代码,dialog这里的content的变量是根本没有过滤,直接XSS

网页搜索的时候,输出在JS里的情况

例如我搜索xss,然后查看源代码如下:

<script>
 $(document).ready(function(){
var get_data = {name: 'leesec', query: "xss"};
$.get('/test.php, get_data, function (reply) {
         ..........
}
<script>

搜索的时候,在JS里面输出字符
接下来我们只要构造好语句,即可弹框
搜索 “};alert(1);//

<script>
 $(document).ready(function(){
var get_data = {name: 'leesec', query: ""};alert(1);//"}
$.get('/test.php, get_data, function (reply) {
         ..........
}
<script>

js代码里换行的重要性

<script>
alert("12");  //在url地址栏路输入 %0a 可在js里换行 导致XSS
<script>

顺带提一下 %0d%0a 回车换行,用来CRLF 注入

js里jquery,ajax的使用注意事项

<script>
	$.ajax({
		type: 'POST',
		url: '/test.php',
		data: 'id=' + id + '&name=' + name
		success: function(response) {}
	});
<script>

上面这代码是在普通不过的代码,但是呢,如果id和name中有一个变量的值可控,

data:'id=x&name=test'});alert(1);</script>那么我们就能执行js代码了