真是岂有此理,注射你也不用这样子整我吧,我倒要看看你这程序有什么能耐。到底不敢再去试那个系统,就从其他地方下手得到了webshell,经过打探,原来那是一个叫做“柯南图片管理系统”的东东。
晓得了牌子那就好办咯,网上Down一个,看看源代码先。
它的view.asp里有这样的话:
if instr(id,"'") or instr(id,"select") or instr(id,"in") or instr(id,"from") or instr(id,"len") or instr(id,"where") or instr(id,"or") or instr(id,"and") then
Response.Write("<script language=javascript>alert('你想做什么?');window.location.href='check.htm'</script>")
Response.End
end if '在这里过滤TMD的不良字符
Response.Write("<script language=javascript>alert('你想做什么?');window.location.href='check.htm'</script>")
Response.End
end if '在这里过滤TMD的不良字符
现在看看check.htm的内容:
<script language=javascript>
alert("我Call!你想做什么???");
for (i=1;i<=10000000000;i++)
{
window.open("http://www.weihai365.com/xxg")
}
</script>
alert("我Call!你想做什么???");
for (i=1;i<=10000000000;i++)
{
window.open("http://www.weihai365.com/xxg")
}
</script>
看看它的险恶用心吧,弹出两个对话框之后就会打开100亿个窗口,呵呵,爽不?
当然不能拿给他白白欺负啊,我得突破它的SQL注射防御才行,呵呵,仔细分析原来他的防御方法只是形同虚设,我们只需变换一下字符就搞定。
看他的判断语句,是用的instr函数判断的,如果发现and、or、select等关键字就转到check.htm。嗯,看看instr的函数的用法:
InStr([start, ]string1, string2[, compare])
有2个可选参数start和compare,问题恰恰出在compare这里。Compare为0执行执行二进制比较,为1执行执行文本比较。默认为0。简言之,compare为0的时候比较时是大小写敏感的。即instr(“ and 1=2”,”And”)等于0。
那现在好办了,只需把它过滤了的关键字的一个字母改成大写,那么他那么长的过滤语句就等于只过滤“’”,无所谓啊,反正注射又用不到“’”。
他的表名是admin,用户字段admin,密码字段password,慢慢手工猜吧,呵呵,好像没有工具可以用,现在知道会编程还是有用处的吧。当然啦,也可以用Union查询直接得到管理员密码,这个比猜解快多了,还是写个程序吧,更快(图1)。
复制URL访问之,诶,不对,你先要把关键字转换一下,特别要注意password包含“or”,admin包含“in”,表说我没提醒你哦。
呵呵,还是那句话:Enjoy Hacking!
哦,最后说下如果要防御的话只需把参数compare设为1就ok。