老地方冰果室交流區

歡迎冰果室讀者在此交流
現在的時間是 08/20/2019 6:42 pm

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 12 篇文章 ] 
發表人 內容
文章發表於 : 07/27/2005 11:29 am 
離線
新生訓練中

註冊時間: 07/27/2005 10:57 am
文章: 5
ulysses 寫:
easyland 寫:
ulysses 寫:

其實這些個『非 Windows IE 使用者不歡迎』的網站也不是完全無法可想。在那些頁面上按下 Submit,內嵌的 HTML 編輯器還是一樣送出純文字的 HTML 碼,就跟普通的 TEXTAREA 一樣。把頁面的 Form 與 SessionID 資料弄出來,然後搭配 CURL,一樣能夠 Post 上去。或許還可以順便附加一些 SQL injection code 讓伺服器掛點。 :badgrin:


真是太令人振奮,彷彿見到一線署光!看來似乎有解決之道,但是從文字中我無法了解如何操作,能否說明的較為詳細一點。謝謝!


別太興奮,這算是駭侵動作,也不是人人都能輕易上手的。

假設你對 HTML 以及伺服器的運作原理有一定程度的了解。

以冰果室這個發佈回應的頁面為例,從 HTML 原始檔可以得知以下資訊:主機 ubb.frostyplace.com 是 59.120.xx.xx 整篇貼文的 Form 的 action 是 "posting.php",method 是 POST。主題欄名稱是 "subject",然後文字欄位名稱是 "message",『送出』按鈕的名稱是 "post"。這個頁面用的是 PHP,因此會有一個 PHPSESSID。這個值有時候會用 Cookie 來傳,可能需要用 Sniffer 來探查。

綜合這些資訊,把你要貼的內容先用 PHP 的 rawurlencode 編碼過:

代碼:
<? echo rawurlencode("你好,這是文章的內容"); ?>


輸出:

代碼:
%A7A%A6n%A1A%B3o%ACO%A4%E5%B3%B9%AA%BA%A4%BA%AEe


你就可以建構出 POST body,例如:

代碼:
PHPSESSID=01234&subject=this%20is%20a%20subject&message=%A7A%A6n%A1A%B3o%ACO...&post=36865


然後用 CURL 來 POST

代碼:
 CURL --data-ascii PHPSESSID=01234&subject=this%20is%20a%20subject&message=%A7A%A6n%A1A%B3o%ACO...&post=36865 59.120.xx.xx


就是這樣。(以上純舉例)

建議你還是去問問網管,有沒有非 IE 的替代方案吧。



http://ubb.frostyplace.com.tw/viewtopic.php?t=18053 我在這看到這篇
>>>>>這個頁面用的是 PHP,因此會有一個 PHPSESSID。這個值有時候會用 Cookie 來傳,可能需要用 Sniffer 來探查。

請問一下大大對於這一段
PHPSESSID 妳是如何取得PHPSESSID值?? 又是如何知有多少的PHPSESSID在傳遞?

因為我也遇到相同問題 我是用PHP寫程式去連結另一端ㄉ伺服器
通過 fsockopen() 建立socket 連結 然後用 fputs()傳送消息 用fgets()接收消息
可是出現ㄌ錯誤訊息
HTTP/1.1 200 OK
少了某些參數


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 12:14 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
PHPSESSID 有兩個方式傳遞,
一個是放在 Cookie 中,
一個是放在 GET/POST 參數中。

標準的 HTTP Request Header 範例:

代碼:
GET /index.php HTTP/1.0↙
Host: www.example.com↙
Cookie: PHPSESSID=xxxx;LANG=CH;xxx=xxx↙



記得所有的換行(↙)都是 CRLF(0x0D + 0x0A)

HTTP Response 中的 Cookie Parser 範例:

代碼:
// $hStr: HTTP Header string
while(eregi("Set-Cookie: ([^\r]+)\r",$hStr,$regs)) {
   $start = strpos($hStr,$regs[0],0);
   $taglen = strlen($regs[0]);
   $hStr = substr($hStr,$start+$taglen,strlen($hStr)-$taglen-$start);
   $token = explode("; ",$regs[1]);
   if(!$token) $token = array(0=>$regs[1]);
   list($k,$v)=each($token);
   $pair = explode("=",$v);
   $cookie[$i] = array("name"=>$pair[0],"value"=>$pair[1],"expires"=>"","path"=>"","domain"=>"");
   while(list($k,$v)=each($token)) {
      $pair = explode("=",$v);
      $key = $pair[0];
      $cookie[$i][$key] = $pair[1];
   }
   ++$i;
}

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 12:20 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
還有,在下是男的,不是老太太。

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 : 謝謝
文章發表於 : 07/27/2005 12:45 pm 
離線
新生訓練中

註冊時間: 07/27/2005 10:57 am
文章: 5
對不起小弟還是php新手
我看不太董妳的scriptㄝ 可以解釋一下嗎??

不太能理解ㄝ她怎ㄇ抓她值
Cookie: PHPSESSID=xxxx;LANG=CH;xxx=xxx 要從哪看到??



那我換個方式問好了
我自己有寫個公告欄在a伺服器 我從B伺服器傳遞一樣出現 HTTP/1.1 200 OK ??
我SCRIPT 如下

if ($Socket = @fsockopen ($HostName, $HostPort)) {
$Querys .="name=&friend=test&message=sdfsfsdf";
$Headers .= "POST /lovetalk/post.php HTTP/1.0\r\n";
$Headers .= "Host: " . $HostName . "\r\n";
$Headers .= "Content-Length:" . Strlen ($Querys) . "\r\n";
$Headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
$Headers .= "Referer: " . $HostName . "\r\n";
$Headers .= "Connection: Close\r\n\r\n";
$Headers .= $Querys;
fputs ($Socket, $Headers . "\r\n");
while (feof ($Socket) == false) $Result .= fgets ($Socket, 1024). "\r\n";
fclose ($Socket);
$Info = explode ("\r\n\r\n\r\n", $Result);
echo (nl2br ($Info[0]));
echo $Info[1];
echo "資料已經送出";

}



我不沒稱呼ulysses為老太太阿??
我是稱呼大大 如果有冒犯先說對不起


回頂端
 個人資料  
 
 文章主題 : Re: 謝謝
文章發表於 : 07/27/2005 12:47 pm 
離線
討論區管理員
頭像

註冊時間: 04/22/2005 7:51 pm
文章: 2894
來自: 台北
jackwong99 寫:
我不沒稱呼ulysses為老太太阿??
我是稱呼大大 如果有冒犯先說對不起

別緊張,因為你打注音的時候沒有選好字,用到「妳」了,我也有注意到... :lol:


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 1:38 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
HTTP Code 200 是『OK』的意思,表示你的 POST 有正確接收到。
你應該要看看回傳資料的 Body 包含哪些資訊。
如果 Body 是空的,那應該是伺服器端的 PHP 當機了。

舉個例子,用 Telnet 連線到 apple.com 主機手動要求網頁:

代碼:
localhost$ telnet www.apple.com 80
Trying 17.254.0.91...
Connected to www.apple.com.akadns.net.
Escape character is '^]'.
GET / HTTP/1.0
Host: www.apple.com


就會回傳如下的資訊:

代碼:
HTTP/1.1 200 OK
Connection: close
Date: Thu, 21 Jul 2005 08:28:55 GMT
Server: Apache/1.3.29 (Darwin) PHP/4.3.1
Content-Type: text/html
Age: 507329

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
(以下略)


意思就是說,你的 POST 沒有寫錯。如果是少 PHPSESSID 或者參數不對之類的錯誤,都是 PHP 程式執行中產生的 Runtime 錯誤,應該要由 PHP 回報錯誤訊息給 Apache,和 HTTP 無關。

如果伺服器端機器也是你在管,在 PHP 程式碼一開始就把所有 $_POST 變數通通 Dump 出來,再加上一堆 Log 訊息,看看到底是哪邊出錯。

另外,『尔』是『爾』的古字,所以『妳』就等於『嬭』,這個字念『乃』,就是老太太。 :badgrin:

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 2:51 pm 
離線
新生訓練中

註冊時間: 07/27/2005 10:57 am
文章: 5
【使用注音文內容經管理員刪除。】


回頂端
 個人資料  
 
 文章主題 : .....
文章發表於 : 07/27/2005 5:08 pm 
離線
新生訓練中

註冊時間: 07/27/2005 10:57 am
文章: 5
我是承租空間的
因為剛接觸 $Socket 這種東西 所以有太多的不了解
因為別人也是跟我說是 PHPSESSID 得關西
他說:要靠 socket 抓 A主機的 session,再利用表頭送到游覽器上欺騙 ie
欺騙 ie 我的程式是從 A主機的上面的檔案發出的


剛好看到你說跟他說的一樣
所以想知要怎麼抓 session 得PHPSESSID 值
要如何知有哪些session 得PHPSESSID 值


回報的有這些 可是我也看不懂哪裡有錯誤
HTTP/1.1 200 OK
Date: Tue, 26 Jul 2005 19:40:40 GMT
Server: Apache/2.0.40 (Red Hat Linux)
Accept-Ranges: bytes
X-Powered-By: PHP/4.2.2
Set-Cookie: cookiej2hbomb=deleted; expires=Mon, 26-Jul-04 19:40:39 GMT
Content-Length: 120
Connection: close
Content-Type: text/html; charset=Big5資料已經送出


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 7:43 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
從你的回報訊息來看,你的 POST 已經成功了,沒有任何錯誤。Apache 伺服器回傳 200 OK,PHP 也回應了『資料已經送出』的訊息,並且設定一個『cookiej2hbomb』的 Cookie,數值是『deleted』。如果伺服器端實際上沒有正確處理這個 POST,那也是其他的問題與 Socket 無關。

你把 Socket、Cookie、Session 與 HTTP 連線全都搞混了。Socket 比較白話的解釋是『兩台機器之間建立的虛擬連線』,就有點像電話撥號。第三者想要介入,只能用『Sniffer』,也就是竊聽器。

Cookie 是 HTTP 的標準,意思就是附加在 HTTP Header 中的一小段參數,由伺服器端主動要求設定,瀏覽器在後續的連線請求中都要附加上同樣的 Cookie 參數,直到這個 Cookie 失效為止。

PHPSESSID 是『附加在 Cookie 中的參數』,不是 HTTP 的標準,而是 PHP 用來記錄使用者暫存資料用的。

舉例來說,像這個討論區要登入才能發文,伺服器可能是先用你的帳號密碼先從資料庫抓出使用者資料,把 UserID 和一個隨機產生的 Session ID 關連起來暫存在伺服器硬碟上,最後把這個 Session ID 用 Cookie 的方式讓使用者端的瀏覽器登記,就是設定成『PHPSESSID』這個 Key。下次使用者端的瀏覽器再次連線時(例如換頁),也會順便把 PHPSESSID 回報給伺服器,PHP 就知道這個連線是由 User ID = xxx 的使用者連過來的。使用這種機制,才不會讓你每次發文都要重新登入一次。

PHPSESSID 並非所有 PHP 程式都會產生,在程式裡要主動呼叫 session_start() 才會登記 PHPSESSID。通常要在需要使用者輸入密碼帳號登入的網站,才會開啟 Session。如果是這種網站,你必須從接受 Login 的那個程式開始,用偽裝 HTTP Client 送出帳號密碼,才能抓到正確的 PHPSESSID。不然的話,就只有用 TCP/IP Sniffer 來監視分析封包,偷聽伺服器與另一台機器之間的對話,再分析內容抓出 Cookie,這個工作不是說有多了不起,但是還是需要高度的網路專業技術,而且也無法用程式全自動進行。

基本上你想要做的事情遠遠超出了你目前的程度。HTTP 協定、Cookie、Session 與偽裝 HTTP Client 不是網路程式新手能很快理解的東西,需要有一段時間的實作經驗,搭配理論與實驗,才能建立正確的概念。如果你是寫來練功,建議你按部就班從 PHP 基礎開始學,不要還沒學走路就想學跳舞。如果你是為了工作,建議你不要用 PHP 自己 Implement HTTP Client,改用 UNIX 命令的 curl。

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 8:12 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
另外,『靠 Socket 抓出 A 主機的 Session、送到瀏覽器上欺騙 IE』,告訴你這段話的人自己不懂網路程式,或者你轉述他的話有誤。他告訴你的東西,是欺騙使用者端的 IE 你自己就是伺服器 A,和你想做的事正好完全相反。

通常這樣做有兩個目的:

1. 你的伺服器當作是整體網路的資料 Gateway。
2. 三流 Cracker 用來詐騙網路帳號。

第一種狀況,用這種代理 POST 是很糟的非正規處理方法;比較正式的系統架構應該用 ODBC 直接建立資料連線,或是用 WDDX、SOAP 或其他 RPC 來傳遞資訊。

第二種狀況,怕教壞小孩細節不多說;不過這也未免太高估會上當的人的智商了。

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 : 我陳清一下
文章發表於 : 07/27/2005 9:43 pm 
離線
新生訓練中

註冊時間: 07/27/2005 10:57 am
文章: 5
我先陳清一下
我學Socket
純粹只是想由B方貼資料到a伺服器
或是某網站的即時新聞訊息由Socket抓取在自己網頁顯示出來
這因該也是Socket原有的功能吧
從沒想過詐騙網路帳號有的沒的

『靠 Socket 抓出 A 主機的 Session、送到瀏覽器上欺騙 IE』
這於說這句話的人他的意思也是大概像ulysses所說的
他意思是說 譬如
A伺服器透過PHPSESSID或session 來防護,不讓A伺服器以外的連結張貼訊息 所以要抓出 A 主機的 Session 讓A主機以為妳是由A主機貼出...(其實我自己也不太了解是PHPSESSID或session )
至於他的程度因該蠻高的 可能因為這樣看不起我這種低程度的 所以也不願說太多.說要收費他才要繼續教我......可憐我只是個窮人...只好繼續自己找資料

因為在網路上這方面資料真的很少所以我就像瞎子摸象
就像ulysses說的我的POST 已經成功了 可是還是出現200 OK 訊息也沒貼出?
別人說HPSESSID或session 得問題安全機制檔下還是有的沒的
我就開始在網路上找相關資訊 從完全不知道到現在有個大概

至於為什麼出現200 OK 訊息也沒貼出就真的還要慢慢摸索

至於 curl我也找過 可是我網站好像不太能支撐curl函數所以只好繼續找socket 相關資料了


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 07/27/2005 11:45 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
你還是沒搞懂。仔細分析給你看:

代碼:
HTTP/1.1 200 OK
Date: Tue, 26 Jul 2005 19:40:40 GMT
Server: Apache/2.0.40 (Red Hat Linux)
Accept-Ranges: bytes
X-Powered-By: PHP/4.2.2
Set-Cookie: cookiej2hbomb=deleted; expires=Mon, 26-Jul-04 19:40:39 GMT
Content-Length: 120
Connection: close
Content-Type: text/html; charset=Big5
資料已經送出


首先從第一行開始:

代碼:
HTTP/1.1 200 OK
Date: Tue, 26 Jul 2005 19:40:40 GMT
Server: Apache/2.0.40 (Red Hat Linux)


這三行訊息是 Apache 回應給你的,這個訊息表示:
1. 你的 HTTP Request 格式沒錯
2. URL 正確
3. 伺服器上的 PHP 有在正常運作

代碼:
Accept-Ranges: bytes
X-Powered-By: PHP/4.2.2


這兩行是 PHP 標準的輸出 Header,表示那個 PHP 程式有被呼叫起來執行。

代碼:
Set-Cookie: cookiej2hbomb=deleted; expires=Mon, 26-Jul-04 19:40:39 GMT


表示那隻 PHP 程式中有呼叫 setcookie 這個函示,伺服器希望使用者端設定 cookiej2hbomb 這個 Cookie。

代碼:
Content-Length: 120
Connection: close


表示 PHP 執行後有 120 byte 的輸出,且程式中沒有再呼叫其他和連線相關的函示。

代碼:
Content-Type: text/html; charset=Big5


這也是 PHP 的標準預設輸出,表示這個網頁是用 Big5 編碼。

代碼:
資料已經送出


這就是 PHP 程式的回應。

綜合以上分析,結論是:

1. 你的 Socket 有正確開啟連線,也有正確送出 POST 訊息。
2. 伺服器端的 PHP 程式有執行,並且回覆你一個『資料已經送出』的訊息。

到這裡為止,一切正常。

問題就是:你送出去的資料,到底有沒有被正常的處理,例如塞進資料庫,或是其他方式處理?這就要看伺服器系統是怎麼寫的了。

如果你 POST 一些資料過去,根本沒反應,可能的狀況有:

1. 伺服器端的程式寫太爛。可能是因為送過去的資料格式不對,或者需要先登入後才能 PO,卻沒有回應錯誤訊息。
2. 資料原本就沒有那麼快更新,可能需要後台管理員手動放上去之類的。
3. 你的 Client 端被 Proxy 住了,一直收到舊資料。
4. 你可能誤以為那個 post.php 會回應完整頁面,其實它就只會回應『資料已經送出』這句話,必須由網站上其他頁筐內的 Javascript 把你重導回另外一個頁面。

這種狀況其實單從你這一邊是不大可能 Debug 的。你最好是能弄到對方的程式碼,看看他到底搞什麼鬼。

至於 Session,舉個簡單的例子:假設你到醫院去看病,你到櫃台掛號,櫃台給你一個號碼牌要你去某某門診等。等到輪到你,你進去看診室把號碼牌給護士,他就用號碼牌檢索調出你的個人資料與病歷。看完病,再拿著號碼牌到藥局去領藥,把號碼牌遞給藥劑師,他就把藥給你。

在這個例子中,『號碼牌』就是你在醫院裡的身分證明。從你掛號開始你的資料就已經在醫院內部流通,你只需要用這個號碼牌,就足以證明你的身分。

Session 也是如此。PHPSESSID 就是你的號碼牌。以這個冰果是為例,你從登入,login.php 把你的暱稱、大頭照、發帖數等資料從資料庫裡調出來,然後發給你一個 PHPSESSID。之後你進入每個版面,viewforum.php 看到了你的 PHPSESSID,就知道這個連線是從 jackwong99 的電腦來的。進入發帖畫面,post.php 看到你的 PHPSESSID,就知道你發帖數不足 20,只能在新手區發問。

大致上就是這樣。所以你現在知道,你之前的認知到底是哪邊不正確了吧?

PHPSESSID 是一個 32 bytes 的隨機數字,通常會保存到你關閉瀏覽器為止。PHP 會自動幫你搞定 Session 的維護,因此不用擔心連線人數、垃圾清除等雜事。

最後,中文的 PHP 資源,請到 http://timteam.org/ 。不過那裡魔人居多,新手最好先充實一下自己。PHP 坊間中文書籍多到爆,隨便買一本來翻翻。

累死了,睡覺去。 :-&

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 12 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
POWERED_BY
正體中文語系由 竹貓星球 維護製作