SQL注入之顯錯注入


注入本質?

1、 SQL顯錯注入是最常見的注入。

2、 注入攻擊的本質,是把用戶輸入的數據當做SQL語句執行。

3、 這里有兩個關鍵條件:

第一個是用戶能夠控制輸入。

第二個是原本程序要執行的代碼,拼接了用戶輸入的數據,然后進行執行。

滲透測試常用函數。

1、 GROUP_CONCAT(col)返回由屬於一組的列值連接組合而成的結果。

  例如:id=9.9 union select 1,GROUP_CONCAT(table_name) from information_schema.tables where table_schema=database()

  可以把所有內容輸出到同一頁面,並且以逗號分隔(admin,dirs,news,xss)

2、 ASCII(char)盲注用,返回字符的ASCII碼值。

3、 DATABASE():返回當前數據庫名。

4、 USER()或SYSTEM_USER():返回當前登陸用戶名。

  例如:字段2,回顯2,有id=9.9 union select 1,USER()。

5、 VERSION():返回MySQL服務器的版本。

  例如:字段2,回顯2,有id=9.9 union select 1,VERSION()。

6、 SLEEP(n)休眠n秒。

小知識點。

1、 要分清 ’ (引號)和 `(反引號)

2、 在PHP中 `(反引號)可以執行CMD語句。

  例如:在php中寫一句 echo `whoami` ,然后再網頁中打開的話,會返回如同CMD中執行的結果。

3、 `(反引號)在JS中可以代替(’ 

  例如:<script>alert(‘非法注入!’)</script>

       <script>alert`非法注入!`</script>

4、 聯合查詢的使用條件:

  1)字段數相等。

  2)字段類型相同。

SQL注入易錯回答分析

1、 sql注入本質是什么?

  把用戶輸入當做代碼執行;

2、 sql注入的條件?

  用戶可以控制輸入和程序原本要執行代碼,拼接用戶輸入的數據且當作SQL語句去執行;

3、 order by的作用及含義?

  order by的原理是對字段進行一個排序,比如,order by 1就是對一個字段進行排序,如果一共四個字段,你order by 5 數據庫不知道怎么排序,於是乎就錯誤了無返回值;

  而在注入中,order by 用於判斷顯示位;

4、 union select如何發揮作用?

  union為聯合查詢,a聯合b進行了查詢,為查詢了前面的sql語句(原有的)后再進行后面的sq查詢(我們添加的),但兩張表聯合查詢的字段數必須相同;

5、 輸出位是什么?

  SQL查詢出來的數據不一定全部會輸出,頁面上只會輸出幾個字段的信息,那幾個會輸出的字段就是輸出位;

6、 information_schema是什么?

  information_schema是mysql的系統自帶表,用於查詢數據,在mysql5.0以上版本中存在;

7、 加單引號和加 and 1=2有什么區別?

  有區別,單引號是為了閉合語句,而and 1=2是為了讓union前面的語句無查詢結果無輸出,然后直接輸出拼接進去union后面的那個語句的查詢結果;

8、 and 是什么意思?

  and 為和的意思,一個語句中,當前一個正確,后一個錯誤時,如果是and連接整個語句返回的是False;

9、 or是什么意思?

  or 為和的意思,一個語句中,當前一個正確,后一個錯誤時,如果是or連接整個語句返回的是True;

10、and 和 or 選擇使用有什么講究?

    and 語句執行時,如果and 前的語句返回False,那么and后面的語句根本不執行;

11、除了單引號外還有其他的符號可以閉合嗎?

  實際上還是要看源碼,常見的是單引號和雙引號還有括號;

12、limit的作用?

  limit 在注入中用於排序然后輸出,limit a,b中 [a代表了從哪個位置(從0開始) b代表從那位開始顯示幾條數據];

13、可以查訊多個字段內容嗎?

  可以,可以使用語句Group_concat()函數進行輸出;

14、%23有什么作用?

  %23編碼為#,用於注釋后面的語句,防止SQL注入點后原本的SQL語句對SQL注入進行干擾[#注釋是Mysql數據庫特有的];

15、報錯注入的原理?

  利用sql注入拼接sql語句,將報錯信息輸出時同時將我們想要的信息輸出;

16、閉合是什么?

  在sql查詢中,代碼比較嚴謹,括號和引號都得成雙成對,引號內的默認是字符串不會當作SQL語句執行,所以必須閉合然后才能注入,當然有些SQL語句直接拼接,也就不用什么閉合了;

17、SQL注入有數據庫限制嗎?

  沒有,常見的數據庫都可以;

18、SQL注入有動態腳本語言限制嗎?

  沒有限制;

19、SQL注入如果沒系統自帶表怎么辦?

  只能通過猜,不斷的嘗試,一般而言數據庫的表也不會亂起名字,畢竟是團隊協作的東西,可以使用到一個exists()函數;

20、系統自帶庫管理員不會修改嗎?

  一般而言並不會;

21、union all 和 union 區別?

  如果輸出的數據有相同的,union只會輸出一次,而union all都會輸出;

22、為什么用and 1=1正常 and 1=2報錯來判斷是否存在SQL注入?

  因為如果存在SQL注入,那么and就是和的意思,1=1是一個恆等式,然后因為原本能夠查出數據,那么兩個真就是True,但是1=2肯定是不可能的,這里就會返回一個False,然后因為和必須兩個真才返回

  True,所以這里拼接就不成立返回False。

注入之聯合查詢的基本流程(Mysql數據庫)。

1. 顯錯判斷注入點。

  ·使用and 1=1 頁面正常。and 1=2  頁面不正常。

  ·使用引號('或"),報錯就說明存在注入。

  ·嘗試在語句末尾加注釋,如果頁面不變可能存在注入(不太准確)。

    例如:遇到url欄中輸入’報錯,可是sql語句不執行的情況下,可能是有id='1'的限制。這時,可以這樣輸入id=1'#或id=1'--+(在#和--+前就可以執行sql語句了)

  ·注:#如果被吞,可以該成 %23。

  ·注:#注釋是mysql數據庫特有的。

  ·注:--+注釋大部分常見的數據庫都有。

  ·如果是數字型傳參,可以嘗試參數+1或-1 (例如id=1+1 或id=1-1)因為在SQL語句中時可以執行運算的。比較好用的是 -1,因為+有時候會當成空格執行。

    例如:

    http://www.xxx.com/new.php?id=1   頁面顯示id=1的新聞

    http://www.xxx.com/new.php?id=2-1  頁面顯示id=1的新聞

    and 1=1 and 1=2 被攔截的可能性太高了

    可以嘗試 and -1=-1 and -1=-2

  ·或者直接 or sleep(5),如果頁面轉圈圈了,就存在SQL注入。

2. 判斷當前頁面字段總數。

  ·判斷字段數的原因:是為了使用聯合查詢,因為在union 內部的 select 語句必須擁有相同數量的列。

  ·語句為:order by語句用於根據指定的列對結果集進行排序。

       order by 語句默認按照升序對記錄進行排序。

  ·order by x(x從1開始)

    例如:如果 order by 3 頁面不正常,說明數據庫只有2個字段。

3. 判斷顯示位。

  ·需要判斷顯示位的原因:因為頁面的內容都是選擇性輸出的,所以要用到該語句。

    比如有兩個字段,第一個字段是id,第二個字段是網頁的內容,用這個語句就是為了找到顯示這個網頁內容的字段。

  ·例如:頁面只會顯示頁面數據的字段內容,不會顯示id字段的內容。所以,要找到哪個地方能夠輸出。

  ·語句為:id=9.9 union select 1,2,3……(有多少個字段,就到幾)

4. 查看當前的數據庫。

  ·語句為:id=9.9 union select 1,2,x,database()

  ·參數必定要為假或使用and 1=2,顯示位的數字改為database()。

5. 查表名。

  ·在mysql數據庫中(.)是選中的意思。

    例如語句為:information_schema.tables.a

    則意思為:在information_schema數據庫中選擇tables表的a 字段。

  ·語句為:id=9.9 union select 1,2,table_name from information_schema.tables where table_schema = database() limit x,1

    或id=9.9 union select 1,2,table_name from information_schema.tables wheretable_schema ='數據庫名' limit x,1

  ·注:x,用於判斷還有沒有其它的表,從0開始。

6. 查列名。

  ·語句為:id=9.9 union select 1,2,3,column_name,5,6,7,8,9,10 from information_schema.columns where table_name = '表名' limit x,1

  ·或id=9.9 union select 1,2,3,group_concat(column_name),5,6,7,8,9,10 from information_schema.columns where table_name = '表名' limit x,1

7. 查字段內容。

  ·語句為:id=9.9 union select 1,用戶名段(密碼段) from 表名 limit 0,1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM