商城類電商軟件及服務提供商--HiShop海商,歡迎您!
最新消息報道,如何登錄進銷存系統(tǒng)?登錄進銷存系統(tǒng)的方式有很多種,下面小編為大家介紹一種用技術的手段登錄進銷存系統(tǒng),SQL注入進行登錄。
關于“進銷存”系統(tǒng)的登錄方法——利用SQL注入進行登錄
“進銷存”系統(tǒng)的登錄存在著SQL注入的漏洞,利用這個漏洞可以繞過用戶名和密碼的判斷,從而進入“進銷存”系統(tǒng)。下面,對于這個漏洞進行具體的說明。
(注:由于系統(tǒng)源代碼可見,于是可以直接通過代碼來分析SQL注入,因此不在這里進行源代碼語句漏洞試探。)
1、首先打開登錄頁面,找到源代碼地址。
圖1——登錄頁面的源代碼地址
2、打開源代碼,找到有關登錄語句驗證的代碼,代碼如下(重要部分已給出注釋):
3、由代碼中可以看到,關鍵的登錄判斷語句為:
sql="select * from login where(username=' "&nowusername&" ' and pwd=' "&md5(nowpwd)&"') or (bianhao=' "&nowusername&" ' and pwd=' "&md5(nowpwd)&"')"
這段語句會判斷l(xiāng)ogin表中是否存在輸入的用戶名和密碼,或者用戶編號和密碼。
下面,提出sql語句進行具體分析:
SQL語句1:
select * from login where (username=' "&nowusername&"' and pwd=' "&md5(nowpwd)&" ') or (bianhao=' "&nowusername&"' and pwd=' "&md5(nowpwd)&" ')
可見,where條件有兩大部分,用or進行連接(形式為:select * from login where條件1 or條件2)。因此,or后面的語句是否為真不重要,只要前面(條件1)為真即可。
再拿出前面的(條件1)語句進行分析:
SQL語句2:
username=' "&nowusername&" ' and pwd=' "&md5(nowpwd)&"'
由這段代碼中可以看到,此部分又分為兩個條件判斷,用and進行連接(形式為:條件1and條件2)。
4、進行SQL注入分析
由上面的登錄代碼分析可見,如果SQL語句2為真,那么SQL語句1也為真?,F(xiàn)在的問題是如何讓SQL語句2恒為真。
現(xiàn)在SQL語句2的形式為:條件1 and條件2,根據(jù)SQL語句1的提示,可以看出,如果SQL語句2形式變成:條件1or條件3 or條件4and條件2,那么可見,即使條件2不為真,如果條件1或者條件3有一個為真,那么SQL語句2就為真。
因此,目的就是要添加or條件3 or條件4到語句中,使SQL語句2恒為真。
5、SQL注入語句構造
username=’ “&nowusername&” ‘ and pwd=’ “&md5(nowpwd)&”‘
由前面代碼分析看出,如果輸入登錄名為admin,密碼為12345,運行時,此段代碼被編譯為:
username=’ admin ‘ and pwd=’ admin ‘
通過編譯后的代碼與后臺數(shù)據(jù)庫進行數(shù)據(jù)對比,判斷是否存在該用戶。
可見,輸入的內(nèi)容首先將被替換為相應的sql語句內(nèi)容,再進行sql語句的執(zhí)行。
先假設一下,如果運行時,代碼被編譯為:
username=’ admin ‘or 1=1 or 1=1andpwd=’ admin ‘
形式為:條件1or條件3 or條件4and條件2,可見條件3恒成立,因此不論條件1和條件2是否為真,此段代碼恒為真。
再把源代碼拿出來進行對比:
預想結果:username=’ admin ’or 1=1 or 1=1and pwd=’admin ‘
相關代碼:username=’“&nowusername&”’ and pwd=’ “&md5(nowpwd)&”‘
代碼中標紅的內(nèi)容是用戶輸入的內(nèi)容,需要注意的是,在標紅的內(nèi)容后面有一個’對應著前面的’。
如果輸入的內(nèi)容為:admin’ or 1=1 or 1=1
代入到標紅內(nèi)容,代碼為:
username=’admin’ or 1=1 or 1=1’ andpwd=’ “&md5(nowpwd)&” ‘
可見,username=’ admin’為條件1,1=1為條件2,pwd=’ “&md5(nowpwd)&” ‘為條件3,但是需要注意的是1=1后面有一個“’”,是源代碼中存在的,如果在輸入的時候,輸入了一個“’”,那么源代碼中的“’”將缺少對應。
SQL語句3:
username=’admin’or 1=1 or 1=1’and pwd=’“&md5(nowpwd)&”‘
可見,如果輸入內(nèi)容為:admin’ or 1=1,將導致內(nèi)容替換代碼后,“’”會缺少一個對應。原因就是我們在輸入的時候輸入了一個“’”。因此,為了讓“’”不缺少對應,我們在輸入的時候再輸入一個“’”。
輸入內(nèi)容為:admin’ or 1=1’
這時,再代入到相應代碼中,編譯后的代碼為:
源代碼:username=’“&nowusername&”’ and pwd=’ “&md5(nowpwd)&”‘
代入后:username=’admin’ or 1=1 or 1=1 ’ ’ and pwd=’ “&md5(nowpwd)&” ‘
可見,這回“’”已經(jīng)不缺少對應了:
SQL語句4:
username=’admin’or 1=1 or 1=1’’and pwd=’“&md5(nowpwd)&”‘
形式為:條件1 or條件2or條件3and條件4
這時,又出現(xiàn)了一個問題,條件3為:1=1’ ’,這不是正確的條件語句,還要修改一下,改為:
SQL語句5:
username=’admin’or 1=1or1=1’’and pwd=’“&md5(nowpwd)&”‘
刪除1=1使形式改變?yōu)槲覀冃枰模?/p>
條件1 or條件2or條件3 and條件4
可見,條件2為:1=1,恒為真,條件3為:’’,是一個不進行判斷的空條件。
因此,SQL語句5因為有條件2恒為真,所以SQL語句5恒為真。
6、總結分析
SQL注入的目的是讓SQL語句1恒成立。
SQL語句1:
select * from login where (username=' "&nowusername&"' and pwd=' "&md5(nowpwd)&" ') or (bianhao=' "&nowusername&"' and pwd=' "&md5(nowpwd)&" ')
如果其中的username=' "&nowusername&"' and pwd=' "&md5(nowpwd)&" '恒成立,那么SQL語句1即恒成立。
語句中的username='"&nowusername&"' and pwd=' "&md5(nowpwd)&"'標紅部分是用戶輸入的內(nèi)容?,F(xiàn)在輸入內(nèi)容:
’ or 1=1 or ‘
替換后為:
username=‘’ or 1=1 or ‘’ and pwd=' "&md5(nowpwd)&"'
此語句變?yōu)楹愠闪ⅰ?/p>
(還可以看出來,如果輸入helloworld’ or 1=1 or ‘,系統(tǒng)一樣可以登錄,原因就是前面輸入的都是條件1的內(nèi)容,無所謂真假,因為1=1的條件恒為真。)
7、測試結果:
登錄名為:’ or 1=1 or ‘
密碼不為空
圖2——SQL注入
點擊登錄,登錄成功。
8、查看登錄日志:
登錄日志
可見,使用SQL注入成功登錄后的用戶標識為“-1”,登錄日志頁面的登錄用戶調(diào)用的是rizi表中的username字段,為什么會是“-1”,原因留給大家去思考。
HiShop友數(shù)進銷存系統(tǒng),為了對企業(yè)生產(chǎn)經(jīng)營中進貨、出貨、批發(fā)銷售、付款等進行全程進行跟蹤,管理,而設計的整套方案。