1. 程式人生 > >sql注入實踐初體驗

sql注入實踐初體驗

  我們知道都web攻擊有著許多種方式,作為一個web開發程式設計師,不但需要了解常見的攻擊方式,還要簡單熟悉其攻擊方法,樓主不是搞CTF的,但很羨慕那種玩CTF的,這兩天玩了一下實驗吧的web題,學習了一些關於SQL注入的知識,很多人對SQL注入概念背的很熟悉,但是並沒有對其實踐過,於是我簡單寫了兩個SQL注入小練習。部署到了樓主的伺服器裡。這篇文章主要針對和我一樣web安全的初級愛好者吧。

先了解一下SQL注入的原理吧:

  所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。 [1] 比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入攻擊。

上面這段話我是摘百度百科的,其實SQL注入的最大的原因就是使用原生SQL對引數進行連線查詢,利用SQL語句的某些特點,達到改造原生SQL語句的目的。大多數框架已經有著很好的防SQL注入的措施了,我常和別人閒聊說如果你不是很牛,就少寫原生SQL吧,框架使用的PDO會有預編譯功能,把SQL語句作為一個模板,再進行引數的插入。

最常見的SQL注入就是用註釋或者改寫條件的方式了。幾乎每個教程都會拿這兩個進行舉例,常用的工具則有SQLmap等。

點選進去嘗試一下,發現顯示 lose id  ,說明id是必須引數。那麼用get方式傳遞一個引數吧。例如這樣:

我們發覺,該SQL語句是直接使用連線引數的方式進行查詢的。那麼如何獲取所有資訊呢?這時候就需要改寫條件了,我們如果將where的條件改成true,那麼該語句將直接轉換為select * from article  。如下圖:

傳入的引數是 id= -1 or 1=1  ,位址列會對引數進行urlencode. 好吧,你已經完成了第一個史上最簡單的SQL注入了。接下來我們試著使用表單注入吧。

如圖,咋們看見的是一個表單,題目已經給了使用者名稱和密碼了,我們嘗試登陸正確的密碼: 

密碼我並沒有進行md5加密,很明顯登陸成功了,通過觀察SQL語句我們可以發現他也是用的常規的使用者名稱密碼匹配機制。那麼如果我們把密碼匹配給想辦法註釋掉了,那麼這個select便可以匹配到資料。那麼登陸也就成功了,我們可以如下操作:

這種注入方式是十分常見的使用"#來提前閉合雙引號以及註釋後面的條件。還有這另一種寫法:

這裡要注意的是--後面還要加個空格,兩種方式的原理是一樣的。很好,史上兩個最簡單的注入你都完成了。

這兩個小栗子基本一個初級程式設計師都能寫出來,不過我覺得很多人並不是像我現在如此的閒,結束了秋招,等待著第二份工作的到來。既然程式碼寫了,還是不要浪費了,於此寫個記錄部落格將這兩個小栗子給大家玩玩。

 見證我的web安全學初體驗。