当前位置:编程学习 > JAVA >>

java实现多线程、结合返回码+文件存在的扫描工具

前段时间乌云shine上报出一些j2ee分层架构安全的洞(去哪儿任意文件读取(基本可重构该系统原工程)),是由于class、xml等文件的访问控制或推送到前台,导致信息泄露、重构等。于是也把这些xml组合成字典,拿出各种大站2级域名来刷rank

就有这么个需求:
1、可以选择域名字典的扫描器
2、可以选择路径字典的扫描器(都有)
3、多线程

找了很久,结果:
1、没有找到可以选择域名字典的扫描器
2、绝大部分的扫描器是根据head头的返回码来判断文件是否存在,而许多站都设置了跳转及自定义的404页面,结果扫描器都给我返回200,实际上不存在
3、很多vb、c写的程序出错了。。。

只能自己写个了
最大的问题就是根据返回码来识别文件存在的问题,
google找到个py版本的思路:http://www.zzzyk.com/kf/201301/186684.html
“ 现成的WEB路径扫描工具颇多,但都不尽如人意,主要是它是根据返回的状态码来判断页面是否存在的,比如返回200,就认为找到页面,404则认为页面不存在。但这里有个问题,返回的状态码是服务端可控的,而工具对于状态码的判断规则大都是定死了的,这就使得扫描结果没有多大价值。
所以抽空写了个web扫描工具,它的原理是先探测一个肯定不存在的路径和页面,/mustnotexistspath/和/mustnotexistspath+ext
,将他两的返回码作为页面不存在的标志,如果与之不同,则页面可能存在,原理相当简单,起到了动态判断的效果。”
根据这个,做了点优化
为了可以手动选择字典。。写个java的,这部分实现代码如下:

public void run(){
// System.out.println(threadnumber+"号线程开始扫描");
while(accessed_url_count != MyJFrame.getNeedto_url_count()
&& !stopscan){

String go_url;
synchronized(pool){
while(pool.isEmpty()){
if(accessed_url_count ==
MyJFrame.getNeedto_url_count()){
System.out.println(threadnumber+"号线程扫描完毕");
return ;
}
try{
pool.wait();
}catch (InterruptedException e){}
}
go_url = (String) pool.remove(pool.size()-1);
accessed_url_count++;
myjframe.setlabel(accessed_url_count);
}
// System.out.println(threadnumber+"号线程扫描
accessed_url_count = "+accessed_url_count);
int abc = go_url.lastIndexOf(".");
//访问一个肯定不存在的url,如果返回相同代码,表示不存在该url

String ex_com = go_url.substring(abc+1,abc+4);
String ex_cn = go_url.substring(abc+1,abc+3);
String go_url_copy;

if(ex_com.equals("com") ||
ex_cn.equals("cn")){//如果最后一个点"."后面跟着com或者cn则
go_url_copy = go_url.substring(0,
go_url.length()-9);
}else{
go_url_copy = go_url.substring(0, abc);
}
try {
hr_first = this.sendGet(go_url);
hr_second = this.sendGet(go_url_copy);

//判断返回代码
if(hr_first.getCode() == 0) continue;
if(hr_first.getCode() != hr_second.getCode() &&
hr_first.getCode() !=404 &&hr_first.getCode()<500){
if(hr_first.getCode()>=400){//400-499
if(xx4xx){
// System.out.println(go_url+"
"+hr_first.getCode());
myjframe.show(go_url,"
"+hr_first.getCode());
myjframe.show(go_url_copy,"
"+hr_second.getCode());
}
}else if(hr_first.getCode() != hr_second.getCode()
&& hr_first.getCode()>=300){//300-399&&不等
if(xx3xx){
// System.out.println(go_url+"
"+hr_first.getCode());
myjframe.show(go_url,"
"+hr_first.getCode());
myjframe.show(go_url_copy,"
"+hr_second.getCode());
}
}else if(hr_first.getCode() !=
hr_second.getCode()){//<300&&不等
// System.out.println(go_url+"
"+hr_first.getCode());
if(hr_second.getCode() == 0)
continue;//腾讯域名错误
myjframe.show(go_url,"
"+hr_first.getCode());
myjframe.show(go_url_copy,"
"+hr_second.getCode());

}

}

} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(threadnumber+"号线程扫描完毕");
finished_thread_count++;
if(finished_thread_count == 20)
myjframe.alertfinished();
}

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,