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