課程編寫php |
||
類別mysql |
內容程序員 |
|
實驗課題名稱sql |
PHP手動注入實驗shell |
|
實驗目的與要求數據庫 |
1.經過手動注入PHP頁面,獲取password字段名。windows 2.瞭解PHP手動注入的基本原理。瀏覽器 3.瞭解PHP手動注入的過程和基本經常使用SQL指令。安全 |
|
實驗環境服務器 |
VPC1(虛擬PC) |
Windows XP系統 |
VPC1鏈接要求 |
PC網絡接口,本地鏈接與實驗網絡直連。 |
|
軟件描述 |
IE瀏覽器或Firefox瀏覽器 |
|
實驗環境描述 |
一、學生機與實驗室網絡直連; 二、VPC1與實驗室網絡直連; 三、學生機與VPC1物理鏈路連通; |
|
預備知識 |
1. SQL注入原理介紹
1.1 什麼是SQL注入 SQL注入是指攻擊者經過在應用程序中預先定義好的查詢語句結尾加上額外的SQL語句元素,欺騙數據庫服務器執行非受權的任意查詢。這類應用程序通常是網絡應用程序,它容許用戶輸入查詢條件(通常是在瀏覽器地址欄進行,經過正常的www端口訪問),並將查詢條件嵌入SQL請求語句中,發送到該應用程序相關聯的數據庫服務器中去執行。經過構造一些畸形輸入,攻擊者可以操做這種請求語句去猜解未受權的內容,也就是SQL Injection,SQL注入。 SQL注入是從正常的WWW端口經過對頁面請求訪問,並且表面看起來跟通常的Web頁面訪問沒什麼區別,因此目前市面的防火牆不多會對SQL注入發出警報,若是管理員沒查看IIS日誌的習慣,可能被入侵很長時間都不會發覺。 通常來講注入攻擊常採用的步驟有發現SQL注入位置、判斷後臺數據庫類型、獲取管理員權限,此外在獲得網站管理員權限後還能夠經過發現虛擬目錄、上傳木馬等手段獲取服務器的系統權限。
1.2 注入原理概述 SQL是一種用於關係數據庫的結構化查詢語言。它分爲許多種,但大多數都鬆散地基於美國國家標準化組織最新的標準SQL-92。SQL語言能夠修改數據庫結構和操做數據庫內容。當一個攻擊者可以經過往查詢中插入一系列的SQL操做數據寫入到應用程序中去,並對數據庫實施了查詢,這時就已經構成了SQL-Injection。 目前使用的各類數據庫如access、SQL Server、my SQL、Oracle等都支持SQL語言做爲查詢語言,所以,若程序員在編寫代碼的時候沒有對用戶輸入數據的合法性進行判斷,有可能致使應用程序的安全隱患,攻擊者根據返回的結果,得到某些想得知的數據。
2. PHP注入原理 php注入與asp注入仍是有區別的,咱們要進行的是跨表查詢要用到UNION.UNION是鏈接兩條SQL語句,UNION後面查選的字段數量、字段類型都應該與前面SELECT同樣.通俗點說若是查尋對的話就出現正常的頁面. 在SQL語句中,可使用各類 MySQL內置的函數,常用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、 CURRENT_USER()這些函數來獲取一些系統的信息,例如:load_file(),該函數的做用是讀入文件,並將文件內容做爲一個字符串返回。若是該文件不存在,或由於上面的任一緣由而不能被讀出,函數返回空。 php注入就是利用變量過濾不足形成的 看看下面兩句SQL語句: ① SELECT * FROM article WHERE articleid='$id' ② SELECT * FROM article WHERE articleid=$id 兩種寫法在各類程序中都很廣泛,但安全性是不一樣的,第一句因爲把變量$id放在一對單引號中,這樣使得咱們所提交的變量都變成了字符串,即便包含了正確的SQL語句,也不會正常執行,而第二句不一樣,因爲沒有把變量放進單引號中,那咱們所提交的一切,只要包含空格,那空格後的變量都會做爲SQL語句執行,咱們針對兩個句子分別提交兩個成功注入的畸形語句,來看看不一樣之處。 ① 指定變量$id爲: 1' and 1=2 union select * from user where userid=1/* 此時整個SQL語句變爲: SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*' ② 定變量$id爲: 1 and 1=2 union select * from user where userid=1 此時整個SQL語句變爲: SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1 看出來了嗎?因爲第一句有單引號,咱們必須先閉合前面的單引號,這樣才能使後面的語句做爲SQL執行,並要註釋掉後面原SQL語句中的後面的單引號,這樣才能夠成功注入,若是php.ini中magic_quotes_gpc設置爲on或者變量前使用了addslashes()函數,咱們的攻擊就會化爲烏有,但第二句沒有用引號包含變量,那咱們也不用考慮去閉合、註釋,直接提交就OK了。
3.步驟: 一般PHP注入的步驟以下: 1) 先查看是否存在漏洞 2) 判斷版本號以決定是否能夠用union鏈接,and ord(mid(version(),1,1))>51 /* 3) 利用order by 暴字段,在網址後加 order by 10 /* 若是返回正常說明字段大於10 4) 再利用union來查詢準確字段,如: and 1=2 union select 1,2,3,......./*直到返回正常,說明猜到準確字段數。如過濾了空格能夠用/**/代替。 5) 判斷數據庫鏈接賬號有沒有寫權限,and (select count(*) from mysql.user)>0 /*若是結果返回錯誤,那咱們只能猜解管理員賬號和密碼了。 6) 若是返回正常,則能夠經過and 1=2 union select 1,2,3,4,5,6,load_file(char(文件路徑的ascii值,用逗號隔開)),8,9,10 /* 注:load_file(char(文件路徑的ascii值,用逗號隔開))也能夠用十六進制,經過這種方式讀取配置文件,找到數據庫鏈接等。 7) 首先猜解user表,如: and 1=2 union select 1,2,3,4,5,6.... from user /* 若是返回正常,說明存在這個表。 8) 知道了表就猜解字段,and 1=2 union select 1,username,3,4,5,6.... from user/*若是在2字段顯示出字段內容則存在些字段。 9) .同理再猜解password字段,猜解成功再找後臺登陸。 10) 登陸後臺,上傳shell
4. 防護技術 從前面講述的原理能夠看出,在數據沒有通過服務器處理以前就進行嚴格的檢查,纔是最根本防護SQL注入的方法。對提交數據進行合法性檢查得方法來過濾掉SQL注入的一些特徵字符,也能夠經過替換或刪除敏感字符/字符串、封裝客戶端提交信息、屏蔽出錯信息等方法來修補漏洞、防止SQL注入。例如: admin1=replace(trim(request(「admin」)),」’」,」」) password1=replace(trim(request(「password」)),」’」,」」) 這兩句語句就過濾掉SQL語句提交時的’號。 此外,也能夠經過給用戶密碼加密的方法,增長破解的難度,例如使用MD5加密,這樣即便獲取了密碼也是加密後的密碼,沒法獲取原始密碼。 |
|
實驗內容 |
經過手動注入PHP頁面,獲取password字段名。 |
|
實驗步驟 |
1.學生單擊 「網絡拓撲」進入實驗場景,單擊 「打開控制檯」按鈕,進入目標主機。如圖所示: 2.使用默認用戶名:administrator,密碼:123456登陸windows xp系統。 3.點擊桌面上的ie瀏覽器: 4.在地址欄輸入http://localhost:8080/index.php?id=1,此時顯示出相關信息。 5.探測是否有注入漏洞 在地址欄後加入and 1=1或者and 1=2,查看頁面狀況,若是頁面無異常,表示存在注入,不然須要進一步探測是否存在漏洞。
6.肯定mysql的版本 在地址後加上and ord(mid(version(),1,1))>51 /* 返回正常說明是4.0以上版本,能夠用union查詢
7.判定數據庫鏈接賬號有沒有寫權限 經過嘗試數據庫鏈接時使用的用戶名、密碼是否在表中,判斷是否對數據庫有寫的權限。 操做方法,在網址後加入and (select count(*) from mysql.user)>0,若返回正確,則擁有該權限,若返回錯誤,則須要從新猜想管理員名稱和密碼。
8.猜想管理員表 在網址後加union select count(*)from admin,判斷管理員表是否叫admin,若是返回正常,說明存在這個表;若返回錯誤,則須要從新猜想表名。 猜數據表中字段數
9.猜數據表中字段數量 在網址後加and 1=1 union select 1,2,3,….,n。前面的and 1=1或1=2均可以,主要是爲了鏈接後面的union語句;後面的1,2,3,….n主要用於標記有幾個字段,若是字段不符合,就會報錯。下圖中的結果顯示正常,代表訪問的數據表中共有三個字段:
10.猜想字段名 與asp注入不一樣,在猜想字段的時候若是字段猜想成功,PHP會直接顯示字段的內容,而不須要再猜想字段內容。操做方式:在網址後加入and 1=1 union select 1,password,3 from admin猜想是否有password字段,若是有則顯示其內容。從圖中看到,由於只有1條記錄,因此password的內容已經顯示出來了,若是沒有這個字段,則會報錯,若沒有記錄則返回空。 十一、實驗完畢,關閉虛擬機,退出實驗平臺。 |