第二节、绕过程序限制继续注入
在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对sql注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。
在“sql注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入sqlserver数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:
简单的如where xtype=’u’,字符u对应的ascii码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。
第三节、经验小结
1.有些人会过滤select、update、delete这些关键字,但偏偏忘记区分大小写,所以大家可以用select这样尝试一下。
2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。
3.特别注意:地址栏的+号传入程序后解释为空格,%2b解释为+号,%25解释为%号,具体可以参考urlencode的相关介绍。
4.用get方法注入时,iis会记录你所有的提交字符串,对post方法做则不记录,所以能用post的网址尽量不用get。
5. 猜解access时只能用ascii逐字解码法,sqlserver也可以用这种方法,只需要两者之间的区别即可,但是如果能用sqlserver的报错信息把值暴露出来,那效率和准确率会有极大的提高。
防 范 方 法
sql注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替asp中的request函数,可以对一切的sql注入say no,函数如下:
function saferequest(paraname,paratype)
'--- 传入参数 ---
'paraname:参数名称-字符型
'paratype:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
dim paravalue
paravalue=request(paraname)
if paratype=1 then
if not isnumeric(paravalue) then
response.write 参数 & paraname & 必须为数字型!
response.end
end if
else
paravalue=replace(paravalue,','')
end if
saferequest=paravalue
end function
文章到这里就结束了,不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助