iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
1
Security

新手眼中的資安系列 第 24

[Day24]- 新手的Web系列XSS 0x8

  • 分享至 

  • xImage
  •  

Day24- 新手的Web系列XSS 0x8

正文

語言特性

  • 隨著網路的發達,web的應用越來越廣泛,web的安全也越重要。開發者時常會疏於各種語言特性的組合,在對程式語言進行程式碼審核時,要根據結合語言的特性,如特殊的變數或函數,去發掘xss漏洞。

PHP

  • php4 phpinfo() XSS
    • phpinfo():
      • 這個函數用於php內部進行,可以輸出大量有關php當前狀態的資訊,例如:php版本、伺服器資訊...等
建立一個php檔
<?php
phpinfo()
?>
連結網頁

  • 就會出現phpinfo的畫面

  • 很多伺服器都有phpinfo()腳本在運行,但是在舊版的phpinfo函數卻存在著安全性漏洞,可能會產生跨網站腳本

  • 測試方法:

    • 舊版php對使用者輸入的變數沒有轉義就列印出來,攻擊者可以透過建構特殊的URL向phpinfo()的輸出中注入html的程式碼引發xss漏洞
    • http://127.0.0.1/xss/phpinfo.php?a[]=<script>alert(xss);</script>
  • 變數覆蓋

    • php可跨平台,應用廣泛,擁有豐富的函式庫,所以導致他的漏洞類型頗多
    • php有一個特殊的漏洞叫做變數覆蓋,根據這個漏洞,可以觸發不同種類型的的攻擊,例如xss、sqlinjection
    • 能引發變數覆蓋的情況,並觸發xss漏洞
      • register_globals=on
      • extract()
      • 遍歷初始化變數

register_globals=on

  • register_globals 是 php.ini 裡的一個配置檔,這個配置會影響php如何接收傳遞過來的參數,register_globals在php 4.2以上的版本會是預設為遮罩
  • 要修改register_globals屬性就是到設定檔php.in,把off改成on
  • 將register_globals調成on:
    • 各種參數都能被重新註冊
      • html表單的請求變數
  • php使用變數不需要進行初始化
  • 例如:
    • 修改完配置之後重新開啟伺服器
    • <?php echo $m; ?>
    • 把變數m輸出頁面,但是在register_globals屬性打開,且變數m沒有初始化的情況下,使用者可以改變設定值,甚至是傳遞javascript程式碼,這樣就能觸發xss
    • 例如:
      • http://127.0.0.1/test.php?m=haha<script>alert(xss)</script>

extract()

  • extract()函數是用來將變數從陣列導入到當前的符號表中
  • 例如:
$m = 1;
extract($_GET);
echo $m;
  • 這段程式碼,雖然變數m已經初始化,但是在連結頁面後,在URL中輸入:http://127.0.0.1/test.php?m=haha,頁面是會變成輸出haha的,變數m就會被重新設定,這是因為這段程式碼用了extract()函數
  • 這段程式碼的作用是使用extract()函數覆蓋所有以GET方式取得的變數
  • 所以如果改成輸入http://127.0.0.1/test.php?m=haha<script>alert(xss)</script>就會觸發xss

遍歷初始化變數

  • 使用foreach()函數
  • 例如:
<?php
$a = 1;
foreach($_GET as $key => $value){
$$key = $value;
}
print $a;
print $b;
?>
  • 這段程式碼使用了foreach()函數處理$_GET導致變數被覆蓋
  • 如執行:http://127.0.0.1/test.php?a=xss&b=xss

上一篇
[Day23]- 新手的Web系列XSS 0x7
下一篇
[Day25]- 新手的Web系列CSRF
系列文
新手眼中的資安30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言