1 <% 2 str = Request("str") 3 4 If not str = "" Then 5 result = Replace(str,"a","aad") 6 result = Replace(result,"i","in") 7 result1 = Mid(result,2,2) 8 result2 = Mid(result,4,6) 9 result = result1 & result2 10 Response.write result 11 If result = "admin" Then 12 pw = "????????" 13 End if 14 End if 15 %>
打开页面就是一个asp源代码,然后代码审计,提交正确答案。
随便提交一个1,用firefox firebug看下请求http://suninatas.com/Part_one/web01/web01.asp?str=1
很好,现在知道了源代码里面的str就是请求url里面的参数。
由于没有学过ASP语法,大概猜了下程序的功能,顺便翻了下ASP手册,(ASP页面默认是VBscript)。
第2行代码是接受请求,参数为str。然后第4行判断str不为空就继续,Replace()函数是替换函数,第五行就是把str里面的‘a‘替换为‘aad‘,然后赋值给result。
第6行代码就是把result里面的‘i‘替换为‘in‘,再赋值给result。Mid()函数是截断函数(我自己这样说的,官方说法不清楚)。第7行就是把result字符串截断成子串。
从第2位开始截取,截取2位,然后赋值给result1。第8行就是把result字符串截断成字串,从第4位开始截取,截取6位,然后赋值给result2。第9行就是连接result1
与result2,赋值给result,此时result的值仍然是字符串。第10行是输出result的值。第11行开始判断result的值是不是admin,是的话就返回pw,否则结束。
了解了程序的大概功能了,接下来就是逆向把答案给推出来。
admin由两个子串组成的可能有6种,先列出来。
result1:null(空) a ad adm admi admin
result2:admin dmin min in n null(空)
显然从第7行可以判断出返回的子串的长度是2,所以是第4组可能最大。
result1=ad,result2=min。
然后推出result的值为*admin(*代表一个未知的字符),接着由第5行就可以知道*其实就是a了。所以完整的result的值就是aadmin,最后得出str的值为ami。
祝贺一下自己吧!!
Authkey : k09rsogjorejv934u592oi