Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

小心你的網頁被用來發廣告信!
post by tommy @ 20 九月, 2006 10:20
上星期六, 之前工作的單位由台固拉了一條 20M 的線路, 當天我也連線過去檢查了一下 firewall 上頭的設定與 web, email 是設定是否正確. 結果... 突然發現, 剛剛明明  postfix 的 queue 是空的, 怎麼幾分鐘不到, 一堆寄給 @aol.com 的信件? 這個單位應該不會有那麼多的信需要寄給 @aol.com 吧.

查了一下 postfix 設定, 並不是因為 open relay 造成的, 看了一下 maillog, 發現也不是內部網路的機器寄出來的, 居然是由 apache 這個使用者在本機上寄出的. 我知道他們有發電子報的功能, 可是... 似乎不太可能會有那麼多的使用者是用 @aol.com 的 email.... 把 postfix 先停下, 然後用 postcat 看了一下還在 queue 裡頭的信件, 果然是廣告信沒錯. 那.... 信是由那兒來的呢?

比對一下 apache 與 postfix 的 log, 發現網頁的某個 mail.php 有重大的嫌疑. 查看了一下那個 mail.php 所在的網頁的功能. 發現是用來推薦這個單位的人事物給你的朋友, 在這個功能上頭, 你可以填寫你的姓名, email, 收件人的 email, 標題及內容, 然後系統會產生一封 email, From 就是你的 email 及姓名, 信件標題會加上你輸入的內容, 信件內容也會加上你所輸入的內容, 透過 php 提供的 mail() 來發送.

不過... 寫程式的人, 在這個輸入的 form 之後, 直接把內容傳到 mail.php, 然後.... 只檢查某個變數, 沒有問題就呼叫 mail() 去寄信了. 類似:

<?php
If(!$FWsendmmail){
header("Location: ./");
}else{
/* mail */
$To=$Tomail;
$Subject=$Myname."向您推薦";
$Body="$Messages\n";
$Body.=$Messagesurl;
$Body=nl2br($Body);
$mlfrom="From:$Frommail<$Myname>\n";
$mlfrom.="MIME-Version: 1.0\nContent-Type: text/html ;charset=big5";
mail( $To, $Subject, $Body, $mlfrom);
echo "<Script> alert('郵件寄出成功'); window.location.href='abc.php?abcid=$abcid'; </Script>";
?>

這兒會有幾個可能的問題:

  1. register_globals, 由於他們有一堆舊程式都是這樣寫, 似乎不打算改... 所以,這兒的變數, 很容易就可以利用傳入的變數來修改.
  2. 只使用一個簡單的 hidden 變數 ($FWsendmail) 來判斷是否由之前的 form 傳入. 不過... hidden 變數並不是真的看不到, 別人只要在查看之前的 form 所產生的 html 原始碼, 就會發現有這個變數.
  3. 變數的內容沒有檢查, 直接拿來使用.

所以, 應該有人利用了上頭的一些問題, 寫了一個專門用來發送廣告信的 bot, 透過這個 mail.php 來寄送廣告信.

這個 bot 主要是利用可以自行輸入 From 的功能, 所以產生了一個類似下頭的 From:

enshrined
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain
X-Mailer: Pegasus Mail for Windows (v4.01)
Subject: nglish
bcc: [email protected]

in the eastern part of arma rovince. ts production is regulated by a qualit=
y consortium that recognizes qualifying products with distinctive mark. nly=
larger fresh hams are used (12 13 kilograms). uring uses relatively little=
....

這時, 程式內會把這個變數寫在 From: 這個 header 上頭, 就變成:

From:[email protected]<enshrined
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain
X-Mailer: Pegasus Mail for Windows (v4.01)
Subject: nglish
bcc: [email protected]

in the eastern part of arma rovince. ts production is regulated by a qualit=
y consortium that recognizes qualifying products with distinctive mark. nly=
larger fresh hams are used (12 13 kilograms). uring uses relatively little=
....

MIME-Version: 1.0\nContent-Type: text/html ;charset=big5

上頭的結果, 就是原本應該有的 header, 在 From 之後, 就被取代了, 所以, 發出去的信的內容, 就完全變成人家所送入的廣告內容了.

然後.. 在裡頭利用 bcc: 的功能, 加上一些收件人, 這樣... 後頭使用 mail() 時, 連同原本的 To: 的 email (上頭程式也沒檢查, 也可以傳入一堆... 不過就算有檢查, 利用 bcc: 一樣可以造成一堆收件人), 再加上 bcc: 裡頭的, 就可以送信出去給這些人了.  這些 bot... 多數的時候, 好像都是一次發給一個人... 不過... 查了一下記錄, 也有一次給數百人, 而會被我在 queue 裡頭看到... 就是因為一次發給太多人了. 否則... 一次一封給一個人... 就算出現在 queue 裡頭, 我應該也很難去懷疑那是廣告信吧.

如果你的系統, 有類似的功能, 最好檢查一下吧. 能夠不要用到外頭傳入的變數來放到 email 的 header 中, 就不要用. 否則...  至少先檢查那些資料,  不可以有換行字元... 確定不會變成別的 header.

還有... referer 也最好檢查一下, 不要直接用 form 上頭的變數來判斷來源, 那個是完全不保險的方式, 至少改用 session 變數來檢查吧.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 136 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS