分类目录归档:PHP

工具:php实现穷举域名功能

1.需求如下:
假设某网站域名为http://www.wangzhan.com,要实现这个功能:
域名第一个字符遍历
http://www.aangzhan.com
……
zangzhan.com
域名第二个字符遍历
http://www.wangzhan.com
……
wzngzhan.com
以此类推到域名最后一个字符遍历
2.实现代码如下:

<?php 
 
$str=$argv[1];
$website_arr=explode(".",$str);
$website_name=$website_arr[1];
$website_length=strlen($website_name);
$key = array(
	array("/j/","l"),
	array("/l/","j"),
	array("/i/","j"),
	array("/j/","i"),
	array("/i/","1"),
	array("/1/","i"),
	array("/j/","1"),
	array("/1/","j"),
	array("/l/","i"),
	array("/i/","l"),
	array("/b/","lo"),
	array("/lo/","b"),
	array("/q/","9"),
	array("/9/","q"),
	array("/u/","v"),
	array("/v/","u"),
	array("/6/","b"),
	array("/b/","6"),
	array("/w/","vv"),
	array("/vv/","w"),
	array("/m/","nn"),
	array("/nn/","m"),
	array("/o/","0"),
	array("/0/","o"),
	array("/m/","n"),
	array("/n/","m"),
	array("/com/","com.cn"),
	array("/com/","cn"),
	array("/com/","net"),
	array("/com/","org"),
	array("/com/","tk"),
	array("/com/","pk"),
	array("/com/","cf"),
	array("/com/","cc"),
	array("/com/","tv"),
	array("/com/","pl"),
	array("/com/","im"),
	array("/cn/","com"),
	array("/cn/","com.cn"),
	array("/cn/","net"),
	array("/cn/","org"),
	array("/cn/","tk"),
	array("/cn/","pk"),
	array("/cn/","cf"),
	array("/cn/","cc"),
	array("/cn/","tv"),
	array("/cn/","pl"),
	array("/cn/","im"),
	array("/cn/","cn.com"),
	array("/cn/","cn.org"),
	array("/cn/","org.cn"),
	array("/cn/","net.cn"),
	array("/cn/","cn.net"),
	array("/www./","www-"),
	array("/www./","www"),
	array("/china/","chnina"),
	array("/abc/","abcd"),
	array("/bank/","bork"),
	array("/bank/","benk"),
	array("/bank/","bonk"),
	array("/bank/","bark"),
	array("/so/","sou"),
	array("/2/","z"),
	array("/z/","2"),
	array("/c/","2"),
	array("/c/","z"),
 
 
 
 
	);
for($j=0;$j<$website_length;$j++){
	if($j==0){
		dealstring('',substr($website_name,$j+1),$website_arr,$key);
	}else if($j==$website_length-1){
		dealstring(substr($website_name,0,$j),'',$website_arr,$key);
	}else{
		dealstring(substr($website_name,0,$j),substr($website_name,$j+1),$website_arr,$key);
	}
}
 
function dealstring($str_zuo,$str_you,$website_arr,$key){
 
//echo 'string:'.$str_zuo.' '.$str_you."\r\n";
 
for($i=97;$i<123;$i++){
 
	echo findHost($website_arr[0].'.'.$str_zuo.chr($i).$str_you.'.'.$website_arr[2],$key);
}
 
}
 
function findHost($host,$key){
	//echo $host."\r\n";
	for($i=0;$i<sizeof($key);$i++){ 		
           $hostChange =preg_replace($key[$i][0],$key[$i][1],$host); 	
           if($hostChange!=$host) 		
              echo $hostChange."\r\n"; 		
        }
} 
?>

下图为运行结果:

接着可以实现访问每个网站检查其是否可以访问,然后监控其内容是否为钓鱼网站。

浅谈UTF-32编码

最近在收集曾经没完全弄明白例子(新手一枚),http://zone.wooyun.org/content/4448 这篇文章里介绍utf-32编码绕过google的xss过滤,成功在ie9以下版本执行js脚本。那么开始分析以下字符是如何转换的。
[0x00][0x00][0x22][0x00] –> ∀
[0x00][0x00][0x3C][0x00] –> 㰀
[0x00][0x00][0x3E][0x00] –> 㸀
通过文章介绍得到utf-32由4个字节组成
%00%00%22%00 –> ∀ (∀字符是%00%00%22%00 通过 utf-32转换utf-8得到的)接下来看例子

<meta charset="UTF-8">
 <?php 
$str='%00%00%22%00'; 
$str=urldecode($str); 
$str=mb_convert_encoding($str,"UTF-8","UTF-32"); 
echo urlencode($str); 
?>

运行后输出:%E2%88%80  也就是∀字符

接着我们就可以写出二哥demo页面 http://www.leesec.com/utf-32.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80

<!DOCTYPE html> 
<html> 
<head> <meta charset="utf-8"></meta> 
</head>
 <body> 
<input type="text" value="<?php echo mb_convert_encoding(htmlspecialchars($_GET['v']),$_GET['charset'],"UTF-8"); ?>">
</input>
 </body> 
</html>

代码运行图片

php spider script

自己用PHP写了个爬虫,基本功能已经实现。 PHP spider 下载地址

linux 环境下运行#php spider.php http://www.leesec.com

下面为测试过程图

下面为测试结果

有兴趣的可以试试

脚本缺点:

1.未对静态页面进行去重处理
2.未对页面内js操作后的结果进行处理
3.相对路径转绝对路径BUG未处理(2014年9月8号修复这个BUG)

shell实现分析youku会员用户数

写这边文章,主要是看优酷视频的时候。几十秒的预告片,竟然要1分钟的广告,所以我就想知道有多少人被逼无奈买优酷的会员。接下来进入正题!!(有点像渗透信息收集,哈哈)

通过观察优酷的用户
A用户
http://i.youku.com/u/UNQ==
B用户
http://i.youku.com/u/UNg==

我发现一种规律,用户共同的URL为
http://i.youku.com/u/U
所以后面的字符串可能为base64编码,经过测试确定是base64编码
A用户
http://i.youku.com/u/UNQ== ->youku_id为5
B用户
http://i.youku.com/u/UNg== ->youku_id为6
以此类推,可以推理出优酷的用户数已经超6亿

接下来我们是要分析每个用户页面里有木有会员的关键字,然后进行for循环即可遍历出所有会员用户的个数。

通过上图可以发现优酷会员的标志是唯一的,然后以订阅作为字符串结束标志即可(为什么要作为结束表示,因为下面有留言版,要是有会员留言容易有误差)

接下来是shell实现优酷会员数代码

for i in $(seq 1 6000000)
do
 
	base64_uid=`echo $i | perl -e 'use MIME::Base64; $_ = encode_base64(<>); print;'`
	url="http://i.youku.com/u/U${base64_uid}"
	mytest=`GET "$url"`
	vipsuper=`echo ${mytest%subscribe_pNode*}|grep ico__vipsuper`
	if [ "$vipsuper" != "" ]
	then
		vip_youku=$[$vip_youku+1]
		echo "youku id:$i vip youku sum:$vip_youku"
	fi
 
done

看看效果把

顺便放出用php实现的代码(加了个功能,统计删除用户的数目)

$youku_vip=0;
$youku_del=0;
 
for($i=1;$i<630000000;$i++){
 
$url='http://i.youku.com/u/U'.base64_encode($i);
 
$content=@file_get_contents($url);
if($content){
	$youku_member_contents=substr($content,0,strpos($content,'<div class="subscribe" id="subscribe_pNode">'));
 
	if(preg_match('/ico__vipsuper/',$youku_member_contents)){
	$youku_vip++;
	echo 'youku_id:'.$i.' youku vip num:'.$youku_vip."\r\n";
	}
}else{
	$youku_del++;
	echo 'youku_id:'.$i.' delete youku num:'.$youku_del."\r\n";
}
 
}
 
echo 'youku vip count:'.$youku_vip;

效果图片如下

php is_numberic函数安全吗?

0x00 简介
国内一部分CMS程序里面有用到过is_numberic函数,我们先看看这个函数的结构
bool is_numeric ( mixed $var )
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

0x01 函数是否安全
接下来我们来看个例子,说明这个函数是否安全

$s = is_numeric($_GET['s'])?$_GET['s']:0;
$sql="insert into test(type)values($s);";  //是 values($s) 不是values('$s')
mysql_query($sql);

上面这个片段程序是判断参数s是否为数字,是则返回数字,不是则返回0,然后带入数据库查询。(这样就构造不了sql语句)
我们把‘1 or 1’ 转换为16进制 0x31206f722031 为s参数的值
程序运行后,我们查询数据库看看,如下图:

如果再重新查询这个表的字段出来,不做过滤带入另一个SQL语句,将会造成2次注入.
0x02 总结
尽量不要使用这函数,如果要使用这个函数,建议使用规范的sql语句,条件加入单引号,这样16进制0x31206f722031就会在数据库里显示出来。而不会出现1 or 1。