CSRF - Cross Site Request Forgery

Mục lục:
  1. CSRF là gì ?
  2. Lịch sử
  3. Kịch bản tấn công

1. CSRF là gì ?
    - CSRF ( Cross Site Request Forgery) là kĩ thuật tấn công bằng cách sử dụng quyền chứng thực của người sử dụng đối với 1 website khác. Các ứng dụng web hoạt động theo cơ chế nhận các câu lệnh HTTP từ người sử dụng, sau đó thực thi các câu lệnh này.
    -  CSRF là kỹ thuật tấn công vào người dùng, dựa vào đó hacker có thể thực thi những thao tác phải yêu cầu sự chứng thực. Hiểu một cách nôm na, đây là kỹ thuật tấn công dựa vào mượn quyền trái phép.
    - CSRF còn được gọi là "session riding", "XSRF".

2. Lịch sử CSRF
    - Năm 2008 người ta phát hiện ra có khoảng 18 triệu người sử dụng eBay ở Hàn Quốc mất các thông tin cá nhân của mình. Cũng trong năm 2008, một số khách hàng tại ngân hàng Mexico bị mất tài khoản cá nhân của mình.Trong 2 trường hợp kể trên hacker đều sử dụng kĩ thuật tấn công CSRF.

3. Kịch bản tấn công


Share:

Sunshine CTF 2019 web solution: WrestlerBook

Link: http://archive.sunshinectf.org:19006/index.html


Lại là form login, điều đầu tiên ta nghĩ đến nên là admin/admin hoặc là lỗi SQLi với form. Ta thử với payload : 1' or 1=1; và ra thông tin về Hulk Hogan

Ta thấy ngay Flag: N/A và đoán được rằng trong database sẽ 1 bảng chứa thông tin các võ sĩ, và sẽ có trường flag trong bảng đó, vấn đề bây giờ là tìm ra được tài khoản thật sự chứa flag.
Quay lại form đăng nhập, tiến hành nhập lỗi cho user/pass thì thấy báo lỗi từ SQLite3 database.

Tiếp tục đếm số cột trong câu truy vấn bằng order by ta biết được có 8 cột, đến đây ta có thể sử dụng kỹ thuật khai thác lỗi basic error SQLi để lấy thông tin:

Username: lnlinh31 Password: ' union SELECT 1, 2, group_concat(name), 4, group_concat(sql), 6, 7, 8 FROM sqlite_master WHERE type = "table";

web trả về kết quả như sau: 

CREATE TABLE `users` ( `username` TEXT, `password` TEXT, `avatar` TEXT, `age` INTEGER, `name` TEXT, `title` TEXT, `flag` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT ),CREATE TABLE sqlite_sequence(name,seq)

Đến đây đã rõ các cột trong bảng users , ta tiến hành dump dữ liệu từ bảng này: 

Username: lnlinh31 Password: ' union SELECT group_concat(username), group_concat(password), group_concat(avatar), group_concat(age), group_concat(name), group_concat(title), group_concat(flag), group_concat(id) FROM users;


Flag: sun{ju57_4n07h3r_5ql1_ch4ll}





Share:

PicoCTF 2018 writeup : Artisinal Handcrafted HTTP 3 - Points: 300

Đề bài: nc 2018shell.picoctf.com 4914



- Chall bắt người chơi phải viết tay những  header của gói tin HTTP để giao tiếp với server có tên là flag.local và đề bài đã cung cấp username/password là: realbusinessuser/potoooooooo.

- Như vậy nhiệm vụ của chúng ta đã rõ: Đó là viết request gửi form đăng nhập đến flag.local để nhận flag. Mạnh dạn gửi 1 request như sau:
           
và nhận lại response:



status code 302 thông báo chuyển hướng đến location: / do đó ta gửi thêm 1 request nữa để lấy flag: 



nhớ kèm theo Cookie để server accept !

và kết quả là: 


Flag: picoCTF{0nLY_Us3_n0N_GmO_xF3r_pR0tOcol5_251f}






Share:

PicoCTF 2018 writeup: The vault (Web challenge)

Link : http://2018shell.picoctf.com:49030/
Đầu tiên, chúng ta có thể đọc source login.php:


Nhìn qua thì challenge này tương tự chall http://2018shell2.picoctf.com:52135/login.html - Irish Name Repo.

Đây là lỗi SQL nhưng khác Irish Name Repo ở chỗ có 1 bộ lọc, bộ lọc này lọc từ "OR" , vì thế chúng ta không thể sử dụng payload kiểu như: 1' OR 1 = 1 -- .

Nhưng thay vì sử dụng "OR" chúng ta vẫn có thể sử dụng "UNION" để khai khác lỗi SQL.
Nhập password : 'union select 1 from users -- 
Lúc này câu truy vấn là : SELECT 1 FROM users WHERE name='' AND password=''union select 1 from users --
Vậy là chúng ta đăng nhập thành công!

Flag: picoCTF{w3lc0m3_t0_th3_vau1t_c4738171}



Share:

CodeBattle2019 Web Solution: Fandances


Truy cập web ta thấy 1 trang login đi kèm với trang register:



Thử tạo 1 account rồi login với account đó là thấy như sau:


Vậy là flag bị chia làm 2 phần, ta sẽ tìm phần  1 ở page này.

Part1: CodeBattle{un1c0d3_st3g44

Tìm tiếp phần 2, sử dụng hint đề cho ta có được file backup  của web gồm 3 file:
login.txt, register.txt schema.sql. Sau khi quan sát 3 file này ta rút ra được đó là:
-         Có 2 bảng là Account và privilege
-         Khi người dùng đăng kí thì sẽ thực thi 2 câu truy vấn  (trong file register.txt)

  
-         Như vậy, bất kì người dùng nào đăng kí mới sẽ bị gán isrestricted = True với tham chiếu qua uid ở bảng privilege. Và với isrestricted = true thì account đó sẽ không lấy được flag(hình dưới)

   

Đầu tiên, khi nhìn đến đoạn này mình nghĩ ngay đến việc sử dụng multi insert trong SQL để insert vào bảng privilege với cặp giá trị (uid,isrestricted) với isrestricted = False nhưng thất bại, và lúc này  mình thấy có hàm mysqli_real_escape_string()  các bạn gg sẽ thấy cách dùng chi tiết của  nó, đại khái là nó giúp ngăn ngừa SQL injection.
Đến đây ta phải đi theo hướng khác! Sau khi nhờ sự trợ giúp của Luân đại ca thì mình biết đến lỗi SQL truncation.  Các bạn gg để biết rõ hơn về lỗi này. Ví dụ độ dài cột username trong bảng Account tối đa được phép 100 ký tự, thì khi ta gửi lên 1 chuỗi có độ dài lớn hơn 100 ký tự thì Mysql  sẽ tự động truncate và giữ lại 100 ký tự đầu mà thôi.
Quay lại bài này. Chúng ta để ý thấy trong file schema.sql không đặt giới hạn cho trường username nên mặc định sẽ là 65535 ký tự với Mysql. Như vậy chúng ta sẽ gửi lên server với độ dài username > 65535 ký tự.
Sau khi truncate , câu query thứ hai trong file register sẽ không có kết quả bởi vì uid của nó tham chiếu đến username vừa bị truncate. Điều đó nghĩa là trường restricted không được đặt giá trị true, do đó ta có thể tiến hành login với account vừa tạo và nhận part2 của flag. Sau đây là script giải quyết:


Part2: _4nd_4_f4m1l14r_ch4l}

Flag: CodeBattle{un1c0d3_st3g44_4nd_4_f4m1l14r_ch4l}



Share:

Root Me Solution : File upload - ZIP (Web CTF Challenge)


Link: http://challenge01.root-me.org/web-serveur/ch51/

Chall này minh họa lỗ hổng File upload trên các ứng dụng web.Các bạn có thể google "File upload exploit" để tìm hiểu kĩ hơn. Quay lại giao diện  nhắc chúng ta upload 1 file zip lên server. Thôi không dài dòng, chúng ta đi vào cách làm luôn nào :)


  1. Tạo 1 symlink đến ../../../index.php bằng câu lệnh: 
    • ln -s ../../../index.php lnlinh31
  2. Nén symlink vừa tạo: 
    • zip --symlinks test.zip lnlinh31
Sau khi nén xong, ta upload file .zip vừa tạo , sau đó truy cập đến path của file mà web tạo ra:
và đây là kết quả, chúng ta có thể đọc được file index.php và lấy flag!

Flag: N3v3r_7rU5T_u5Er_1npU7





Share: