2012
Nov
19

有不少公司,都會舉辦「選美女」、「選廣告詞」等等的活動,為了不花費太多的成本,通常會做一些小型的投票網站,這些網站若沒有做好 Security 的工作,駭客便可以輕鬆的進行灌票,由駭客來選出第一名。

建議小公司還是使用線上的免費投票系統,沒有足能夠人力就不要自已做了。

下列會介紹一些常見的破解投票系統的方式

沒有使用 Captcha

Captcha 是一種簡單的防止駭客使用程式快速灌票的工具,Captcha 可以用圖形畫出一段文字,並強迫 User 要填入這文字的內容,只要圖形文字上做一點混淆和變形,就能防止文字被程式破解。

而沒有使用 Capcha 的票選系統,是最容易被駭客灌票,只要簡單的寫個 Post or Curl 就可以無止盡的瘋狂灌票了。

一個 Captcha code 的範例

Captcha

Captcha Code 是空值

Captcha Code 會在 User 載入圖片的時候產生,並且記錄一個值在 session or 其他儲存方式,駭客只要埜止瀏覽器自動載入圖片,這樣伺服器就不會產生一組 Captcha Code,接著駭客就在 Form 表單中,故意不填 Captcha,就可以繞過 Captcha 的檢查。

這個漏洞的關鍵在於,工程師在開發票選系統的時候,沒有過瀘空值。

vote1-1.php 沒檢查 Captcha 空值的範例
  1. <?php
  2. if ($_POST['Captcha'] != $_SESSION['Captcha']) {
  3. vote();
  4. }
  5. ?>

看 「vote1-1.php 」這個範例就知道,如果 $_SESSION['Captcha']是空值,那只要駭客輸入的 $_POST['Captcha'] 也是空值,投票就成功了。

vote1-2.php 正確的寫法
  1. <?php
  2. $REG = '/^[a-z0-9]{4,8}$/i';
  3. if(!preg_match($REG , $_POST['Captcha'])) {
  4. //return fail
  5. exit(1);
  6. }
  7. if ($_POST['Captcha'] != $_SESSION['Captcha']) {
  8. vote();
  9. }
  10. ?>

Captcha Code 未清除成 init 狀態

就算工程師知道要過瀘空的 Captcha Code,不過漏洞可能還是會存在,在比對完 User 從 Form 表單填入的 Captcha Code 之後,還要記得將 Captcha 清空,否則駭客只要人工辨識一次 Captcha 圖形的值,然後再一次的關掉瀏覽器自動載入圖片的設定,就能保證 Captcha 永遠不會更新。

在 vote1-1.php 的範例中,因為 $_SESSION['Captcha'] 在投票結束後,沒有被清除,導致駭客可以重覆使用同一個 Captcha 。

vote2-1.php 有清除 Captcha 的範例 (第八行 unset)
  1. <?php
  2. $REG = '/^[a-z0-9]{4,8}$/i';
  3. if(!preg_match($REG , $_POST['Captcha'])) {
  4. //return fail
  5. exit(1);
  6. }
  7. if ($_POST['Captcha'] != $_SESSION['Captcha']) {
  8. unset($_SESSION['Captcha']);
  9. vote();
  10. }
  11.  
  12. ?>

從這個例子來看,可以知道程式的邏輯大致可以分成三個階段。

  • 1. initial
  • 2. process
  • 3. clear (initial again)

確保這三道手續都有完成,可以讓程式的 「Bug」 Or 「漏洞」少一點


回應 (Leave a comment)