1. 程式人生 > >url編碼&&PHP大法

url編碼&&PHP大法

dex -1 文檔 site code 建議 分享 blog index.php

URL編碼

Url編碼通常也被稱為百分號編碼(Url Encoding,also known as percent-encoding),是因為它的編碼方式非常簡單,使用%百分號加上兩位的字符——0123456789ABCDEF——代表一個字節的 十六進制形式。Url編碼默認使用的字符集是US-ASCII。例如a在US-ASCII碼中對應的字節是0x61,那麽Url編碼之後得到的就 是%61,我們在地址欄上輸入http://g.cn/search?q=%61%62%63,實際上就等同於在google上搜索abc了。又如@符號 在ASCII字符集中對應的字節為0x40,經過Url編碼之後得到的是%40。

  對於非ASCII字符,需要使用ASCII字符集的超集進行編碼得到相應的字節,然後對每個字節執行百分號編碼。對於Unicode字 符,RFC文檔建議使用utf-8對其進行編碼得到相應的字節,然後對每個字節執行百分號編碼。如"中文"使用UTF-8字符集得到的字節為0xE4 0xB8 0xAD 0xE6 0x96 0x87,經過Url編碼之後得到"%E4%B8%AD%E6%96%87"。

  如果某個字節對應著ASCII字符集中的某個非保留字符,則此字節無需使用百分號表示。例如"Url編碼",使用UTF-8編碼得到的字節是 0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,由於前三個字節對應著ASCII中的非保留字符"Url",因此這三個字節可以用非保留字符"Url"表示。最終的Url編碼可以簡化 成"Url%E7%BC%96%E7%A0%81" ,當然,如果你用"%55%72%6C%E7%BC%96%E7%A0%81"也是可以的。

PHP大法

<?php
if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>
"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "<p>Access granted!</p>"; echo "<p>flag: *****************} </p>"; } ?> <br><br> Can you authenticate to this website?

如果id=hackerDJ不輸出flag但是解碼後的id=hackerDJ可以輸出flag

%的編碼為%25,h的編碼為%68,所以合起來為%2568,

所以 payload:

http://ctf5.shiyanbar.com/DUTCTF/index.php?id=%2568ackerDJ

得到flag:

技術分享

url編碼&&PHP大法