Vĩnh Phi Blog

/* Lê Vĩnh Phi */

Protected: Fresher — August 11, 2022
Security: SQL Injection và SQLMap Công cụ khai thác lỗ hổng SQL Injection — January 2, 2022

Security: SQL Injection và SQLMap Công cụ khai thác lỗ hổng SQL Injection

Hí anh em. Hôm nay mình tạo một chủ đề để cùng mọi người chia sẻ và trao đổi thêm về vấn đề Security SQL Injection này nhé.

Sơ qua về Sql injection (SQLi), thì SQLi là gì?

SQLi là một kỹ thuật khai thác lỗ hổng cho phép attacker có thể inject vào các sql query và thực thi query đó. Từ việc đó attacker có thể thao tác tự do trên cơ sở dự liệu và thực hiện lấy dữ liệu hoặc thay đổi, xóa, đánh sập cơ sở dữ liệu của ứng dụng.

Các nguyên nhân để gây ra lỗi SQLi là input từ người dùng không được validate hoặc validate không kỹ.

Và đây là một vài kiểu tấn công SQLi:

  1. Boolean-based blind
  2. Time-based blind
  3. Error-based
  4. UNION query-based
  5. Stacked queries, hoặc được gọi là piggy backing

để đọc rõ hơn về các kiểu tấn công này, mọi người có thể tham khảo thêm ở đây:

https://github.com/sqlmapproject/sqlmap/wiki/Techniques

Vì SQLi là một lỗ hổng được xếp vào dạng rất nguy hiểm nên luôn được xếp trong top đầu các lỗ hổng bảo mật web phổ biến theo chuẩn OWASP. Trong bài viết này mình đã nói sơ qua khái niệm cơ bản cũng như các kiểu tấn công SQL Injection và mình sẽ giới thiệu đến mọi người một công cụ hỗ trợ khai thác lỗi SQLi này đó là SQLMap.

SQLMap là gì?

SQLMap là công cụ khai thác các lỗ hổng SQLi tồn tại trong cơ sở dự liệu của ứng dụng. SQLMap là mã nguồn mở viết trên nền python và được chia sẻ trên sqlmap.org. để chạy được SQLMap thì mọi người cần cài python đã nhé.

Các tính năng mà SQLMap hỗ trợ thì đã có viết wiki của nó, mọi người có thể lên https://github.com/sqlmapproject/sqlmap/wiki để đọc kỹ hơn nhé. mình sẽ dẫn ra đây một vài điều được viết trong đó để bài viết được dài hơn :))

Như mọi người đã biết thì SQLMap là công cụ khai thác lỗ hổng SQLi nên SQLMap sẽ hỗ trợ làm việc với các nền tảng databases dưới đây.

Full support for MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, Percona, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso database management systems.

Và SQLMap cũng hỗ trợ các kiểu kỹ thuật khai thác như: boolean-based blind, time-based blind, error-based, UNION query and stacked queries.

và còn rất nhiều kiến thức khác cần tiếp thu ở wiki nhé mn.

Cách cài đặt và sử dụng SQlMap.

đầu tiên thì mọi người cần cài đặt python (SQLMap có thể chạy ở các phiên bản 2.6, 2.7, 3.x của python nhé)

Download SQlMap:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

sau đó mọi người mở terminal và truy cập vào thư mục sqlmap-dev vừa tải về nhé.

tiếp theo gõ lệnh:

./sqlmap.py -h

và thấy như hình là đã cài đặt thành công rồi đó.

Một số câu lệnh cơ bản SQlMap:

./sqlmap.py [-u url target] [options]

Options của SQLMap rất nhiều, nên mọi người có thể truy cập và xem thêm ở đây nhé:

https://github.com/sqlmapproject/sqlmap/wiki/Usage

Demo khai thác lỗ hổng bằng SQLMap.
đây là 1 site demo để mọi người có thể thực hành thoải mái cách khai thác SQLi nhé.

http://testphp.vulnweb.com/

để kiểm tra xem ở trong site này có lỗi SQLi hay không thì mình thử tìm bằng tay xem nhé.

thường thì các lỗi SQLi được bắt gặp ở các phần search hoặc các params động như là id ở url nên mình sẽ thử kiểm tra phần này xem.

Bước 1: truy cập vào http://testphp.vulnweb.com

bước 2: thử tìm kiếm với từ khóa ' hoặc nối chuỗi id với ' . nếu văng error message đại loại về mysql thì chuẩn là page đó có dính SQLi.

mình đã thử tìm thì có các page sau đây dính lỗi SQLi:

http://testphp.vulnweb.com/search.php?test=query%27

http://testphp.vulnweb.com/listproducts.php?cat=1%27

http://testphp.vulnweb.com/artists.php?artist=1%27

bây giờ thử thực hiện khai thác bằng tool SQLMap nhé.

Bước 1: chạy lệnh ./sqlmap.py -u http://testphp.vulnweb.com/listproducts.php\?cat=1

mọi người sẽ thấy như hình, gồm các thông tin như là DBMS đang sử dụng là MySQL, parameter có lỗi SQLi là cat các kiểu kỹ thuật khai thác thì gồm boolean-based blind, error-based, time-based blind, UNION query và có các payload kèm theo để mọi người có thể hiểu rõ hơn về từng kiểu khai thác

Bước 2: để biết được tên schema mà ứng dụng đang sử dụng là gì mình sẽ sử dụng option -dbs

tiếp tục thực hiện lệnh:

./sqlmap.py -u http://testphp.vulnweb.com/listproducts.php\?cat=1 -dbs

và sẽ thấy kết quả như hình, gồm danh sách schema trong cơ sở dự liệu đó.

bước 3: sau khi xác định được cơ dở dữ liệu mà ứng dụng đang kết nối mình sử dụng tiếp option -D để chọn tên schema và option -tables để list ra tất cả các bảng trong schema đó.

tiếp tục thực hiện lệnh:

./sqlmap.py -u http://testphp.vulnweb.com/listproducts.php\?cat=1 -D acuart -tables

và kết quả như hình, gồm tất cả bảng nằm trong schema vừa chọn.

bước 4: tiếp theo có danh sách bảng rồi thì ta tiếp tục thực hiện show dữ liệu có trong bảng đó bằng option --dump và option -T là tên table muốn show dữ liệu.

câu lệnh để thực hiện:

./sqlmap.py -u http://testphp.vulnweb.com/listproducts.php\?cat=1 -D acuart -T users --dump

Như vậy là ta đã lấy được dữ liệu đặng nhập rồi.

Trên đây là cách cơ bản để thực hiện tấn công khai thác lỗ hổng SQLi. Mong mọi người sau khi đọc qua bài viết này thì có cái nhìn rõ hơn và hiểu được cách tấn công cũng như biết được cách để prevent lỗi này để hệ thống được bảo mật hơn nhé. Thân ái và quyết thắng. Xin chào mọi người.

Security: Tìm và khai thác lỗ hổng API — December 16, 2021

Security: Tìm và khai thác lỗ hổng API

Xin chào mọi người, sau bao ngày bận rộn với dự án cũng như lo toan bộn bề cho việc sắp đón một thành viên mới của gia đình thì hôm nay mình cũng có được một tý thời gian rảnh để ngồi xuống và viết một bài chia sẻ cho mọi người. Để chọn được chủ đề và viết một bài viết chia sẻ kiến thức cũng khá vất vả, cuối cùng mình cũng đã chọn được một chủ đề cũng khá là thú vị, đó là Security, cách tìm và khai thác lỗ hổng từ Public API.

Chả là mình có một đứa em độ tuổi dở dở ương ương, rất mê đọc truyện tiên hiệp, ngôn tình, đô thị … chuyện sẽ chả có gì nếu nó chỉ việc lên google tìm và đọc những truyện ở trên đấy, nhưng ngặt nỗi là nó lại tìm thấy một app đọc truyện, và tất nhiên phải trả phí cho từng tập truyện đó mới có thể đọc được. Ban đầu thì nó siêng cày các nhiệm vụ trong app để kiếm điểm đọc truyện, dần dà cũng hết nhiệm vụ và phải nộp tiền để đọc, có hôm nó hỏi đến mình có cách nào đọc free trên đó không, thế là công cuộc tìm và khai thác lỗ hổng bug tiền và xu trong app bắt đầu.

Mục tiêu của lần tấn công này là ứng dụng “Lemon Novel – Truyện Chanh” các công cụ khai thác gồm:

  1. Packet Capture – Dùng để tracking những API request trong ứng dụng. cài trên andoid nhé mọi người.
  2. Postman – Dùng để gửi request đến endpoint API.

Để khai thác lỗi từ bất ký ứng dụng nào thì mình phải biết cách sử dụng ứng dụng đó đã, nên đầu tiên mình sẽ cài ứng dụng “Lemon Novel – Truyện Chanh” vào con ROG Phone 5 của mình và thử mở ứng dụng sử dụng thử đã. À, trong ứng dụng này có mục Tủ sách, Kho sách, Hoạt động dùng để kiếm điểm, Cá nhân để theo giõi các hoạt động của tài khoản như số tiền đã nạp, …

Bây giờ, để thực hiện tìm khai thác lỗ hổng thì mình sẽ mở ứng dụng Packet Capture và chọn ứng dụng Lemon Novel để thực hiện tracking request nhé. Sau khi làm xong bước ở trên thì mình sẽ mở lại ứng dụng Lemon Novel và thực hiện một vài nhiệm vụ, đọc sách, … để Packet capture thu được những API nào.

Sau khi lướt qua ứng dụng và mình thấy một số chức năng có thể sẽ có lỗi bug tiền như là làm nhiệm vụ xem video để nhận tiền, điểm danh nhận tiền, … nên mình sẽ thử capture các request từ việc làm nhiệm vụ này xem. Sau một hồi mò mẫm tìm các API có thể có lỗi thì mình cũng tìm được một lỗi khá là nghiêm trọng là cho phép bug vô số vàng và kim cương trong ứng dụng này. API gặp lỗi này là API làm nhiệm vụ xem video nhận kim cương, như ở hình dưới.

endpoint:

http://rest.lemonnovel.com

path:

/rest/user/syncUserServerData

body:

{
  "uuid": "0e5e6e349695420a308d3fa8c43b2612",
  "cash": 0.0,
  "diamond": 24.0,
  "gold": 24.0,
  "records": [
    {
      "id": 13,
      "amount": 6,
      "type": "gold",
      "status": 0,
      "time": 1639651652591
    }
  ]
}

nhìn vào path là syncUserServerData thì có vẻ là đồng bộ dữ liệu của user lên server, và body thì có param records múc đích là để gửi tác vụ cộng xu cho user có uuid là 0e5e6e349695420a308d3fa8c43b2612

rồi, đã có endpoint, path, body, bây giờ mình thử bật Postman lên để thử gửi request xem nào.

gửi lần đầu thì vẫn không có kết quả gì, mình sẽ thử sửa một tý ở phần body xem, cụ thể là sửa field id và field time ở body và thực hiện gửi lại.

bùm… đã có kết quả. số gold ở response đã cộng thêm 6. hehe. vậy thì thử sửa field gold thành 99999999 và xem kết quả nào…

tiếp tục sửa field type = diamond và gửi request. kết quả:

bây giờ thử mở app Lemon Novel và xem thành quả thôi.

Như vậy là đứa em mình có thể thoải mái đọc truyện với số vàng và kim cương này rồi. hehe.

Qua các bước thực hiện bug vàng và kim cương ở trên, mình mong các bạn có cái nhìn rõ hơn về việc bảo vệ cho API và nắm được vấn đề thì chúng ta mới biết đường mà triển khai đối ứng để tránh xảy ra những lỗi nghiêm trọng như vậy nhé.

Bài viết này chỉ với mục tiêu là giới thiệu cho các bạn biết thêm về những cách khai thác lỗ hổng trong một ứng dụng, còn muốn đào sâu hơn vào từng vấn đề, cũng như cách triển khai ở mặt code thì hẹn các bạn ở bài viết khác nhé.

Xin chào và chúc một ngày tốt lành. Cảm ơn các bạn đã đọc bài viết.

Docker: cách viết một Dockerfile và build thành image — November 29, 2018

Docker: cách viết một Dockerfile và build thành image

Ở bài trước mình có chia sẻ về cách cài đặt, khởi tạo và chạy thử một docker container, bác nào muốn đọc lại thì link đây ạ: Cài đặt và sử dụng Docker

Hôm nay mình sẽ viết một file Dockerfile để build thử một cái image example xem nhé.

Format trong file:

# Comment
INSTRUCTION agruments

ở đây thì INSTRUCTION sẽ không phân biệt case-sensitive, nhưng để tốt nhất thì nên viết UPPERCASE cho dễ phân biệt enviroment variable nhé các bác.

Docker sẽ chạy lần lượt các lệnh trong file Dockerfile từ trên xuống, và một Dockerfile phải bắt đầu bằng enviroment variable FROM .  còn FROM là gì các bác đọc ở dưới nhé. :3

một vài enviroment variable hỗ trợ trong Dockerfile:

  • ADD # Dùng để copy các file, folder vào trong filesystem của image
  • COPY # Dùng để copy các file, folder vào trong filesystem của container
  • ENV # Dùng để đặt biến môi trường và sử dụng trong quá trình build image
  • EXPOSE # Dùng để chỉ định các port mà container sẽ lắng nghe khi đang chạy
  • FROM #  khởi tạo một build stage mới và đặt Base Image cho các instructions tiếp theo
  • LABEL # The LABEL instruction adds metadata to an image.
  • USER # sets the user name (or UID) and optionally the user group (or GID) to use when running the image and for any RUNCMD and ENTRYPOINT instructions that follow it in the Dockerfile
  • VOLUME # https://docs.docker.com/engine/reference/builder/#volume
  • WORKDIR # https://docs.docker.com/engine/reference/builder/#workdir

Đọc thêm về các enviroment variable:  https://docs.docker.com/engine/reference/builder/#from

Các bác đọc hướng dẫn ở link trên kỹ mới làm tiếp được nhé, các bác thông cảm vì nó hơi dài nên mình dẫn link như vậy 😀

Bây giờ mình sẽ viết một docker image chứa wordpress nhé

to be continue…

Javascript: Object và một vài methods hay với nó —

Javascript: Object và một vài methods hay với nó

1. Object.freeze()

Method này giúp chúng ta đóng băng một object, không thể thêm, thay đổi, xóa, hay ghi đè lên object đang bị đóng băng. Khi thực hiện thay đổi object đó thì nó sẽ throw lỗi ở ​`strict mode`. Áp dụng Object.freeze trong trường hợp đảm bảo tính bất biến của một Object, Giúp mình có thể biết được Object đó đã có giá trị từ trước là những gì và nó không bị thay đổi trong suốt quá trình một ứng dụng chạy. An tâm trong việc code hơn Continue reading

WAKE UP AT 6AM FOR 30 DAYS — September 24, 2018

WAKE UP AT 6AM FOR 30 DAYS

THỨC DẬY 6H SÁNG TRONG 30 NGÀY

Ngày 1: 6h chuông báo thức kêu, cảm giác cái chăn nặng 100kg đè cứng người xuống nệm, mặc dù hôm trước đã quyết tâm sáng dậy sớm, thể dục, ăn sáng, … mà đến sáng hôm nay vẫn phải delay lại 10 phút vì phải vật lộn với cái chăn : )) hơi failed tý nhưng cũng có kết quả là dậy sớm. Continue reading

Làm preload bằng CSS —
Cài đặt và sử dụng Docker — June 27, 2018

Cài đặt và sử dụng Docker

1. Docker là gì?

Docker là open source dành cho các developer hoặc sysadmin build image, gửi image, và chạy image đó trên nhiều nơi khác nhau như trên windows, laptop, VPS, …

à, vậy Docker image là gì?

Docker image là một template bao gồm các required libraries, command cần thiết để có thể build một Docker container. Container này sẽ chạy dựa theo cấu hình đã được cài sẵn trong Docker image đó. Continue reading

Javascript: For-of loop, cú pháp mới trong ES6 — June 25, 2018
Javascript: Spread syntax (…) trong ES6 — June 19, 2018