8. LAB:SQL Injection

SQL Injection:

理論與簡介:

  • SQL injection:

             一般連接SQL寫法都是將處理過(或未處理過)的使用者輸入,直接塞進SQL code,
            使SQL Code跟使用者輸入一起被SQL的編譯器編譯,這時候如果使用者輸入裡包含SQL語句,
            該輸入又未經處理 就會造成SQL injection

  • Prepared Statment:

             Prepared Statment是將SQL語句先傳入SQL 編譯器進行一次編譯,

             將原本該給使用者輸入的地方用特殊符號取代

             再將使用者輸入作為參數傳入,從而避免被SQL injection

             這種作法又稱參數化查詢

使用工具:

  • 如果你只想解一三題:
    • burpsuite(改封包用,當然第一題也可以直接寫在input)
  • 如果你還想玩二四題:
    • JDK
    • Apache Tomcat
    • Maven
    • 以上為改完程式碼編譯及建環境用

手法:

  • Stage 1 String SQL injection
    • 說明:第一題要我們用老闆的帳號登入,而且不可以用正確密碼
    • Step.1:看到題目,先在選擇框任意輸入,Login
    •   
    • Step.2:將Password改成以下
      • ' or '1'='1
    • Step.3:按下Forward 完成
  • Stage 3
    • 說明:Stage3要求以員工的帳號登入 ,並看老闆的個資
    • Step.1:看到題目,先登入密碼為larry
    • Step.2:點擊ViewProfile,攔截封包
    • Step.3:改成101 or 1=1 order by employee_id desc(列出全部 排列 按照員工ID大小 最大的在第一個)
  • Stage2: Block String SQL injection
    • 說明:剛剛打的洞,這回合要修補
    • Step.1:找開發者版本的原始碼,找到Login.java,裡面的SQL語句長這樣
    • Step.2:改用Prepared Statement
  • Stage4: Block Numberic SQL injection
    • 說明:剛剛打的洞,這回合要修補
    • Step.1:找開發者版本的原始碼,找到ViewProfile.java,裡面的SQL語句長這樣
    • Step.2:改用Prepared Statement

心得:

SQL injection一般的表現形式是在使用者輸入表單插入 ' 單引號來截斷SQL語句

使得一般面對SQL injection時,時常以為是SQL的問題,或單引號的問題

事實上 SQL injection只是目標是後端資料,並且利用SQL語法

在問題的產生根解決辦法都不應該只注意SQL 跟 單引號

只注意單引號跟SQL這兩件事情,很容易產生No SQL No Injection或只要把單引號拿掉就沒事,的誤解

例如: LAB3的payload

1 or 1=1 ORDER BY emplyee_id DESC 

就為全沒有單引號,但仍然造成DB的injection