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)