E-Commercial — Chatbot and a Reality CTF Challenge

Thu Nguyen
Jan 16, 2018 · 5 min read

“…Ta bước qua đời nhau như lữ khách đi ngang
Dường như đôi ta đã, quên những gì cho nhau, làm sao được hay trách giọt nước mắt kia vừa rơi đã khô mau
Chiều nay tình cờ, anh bước trên con phố
Nơi mà khi ngày xưa, dưới mưa mình chung ô
Ùa về trong anh là những kỷ niệm ngày xưa, chiều lại mưa

…”

Hôm nay trời cũng mưa, đường lại bẩn, chẳng làm gì được ngoài ngồi nhà chim lợn trên fb…

Dạo này fb cũng rác quá, lướt loanh quanh newfeed toàn thấy đội ngũ bán hàng online + ads, đúng là cái gì miễn phí đều có giá của nó thật.

Rồi vô tình đập vào mặt mình là 1 page quần áo, đặc biệt ở chỗ page này sử dụng chat bot cho việc chăm sóc khách hàng !!! (Very Impressive!)

Khi người dùng comment hoặc nhắn tin dưới dạng: chitiet <id> thì website sẽ auto check tính available của mặt hàng và trả về kết quả dưới dạng:

Cái bản tính thích chọc ngoáy của mình mách bảo rằng chắc chắn có gì đó sai sai ở đây.

Sau đó mình đã test lại với các trường hợp:

chitiet 1234a => true

chitiet 1234) => true

chitiet 1234" => true

chitiet 1234.0 => true

chitiet 1234.1 => false (Hmm)

chitiet 1234' => false (Ahaa got u!)

Vậy là sử dụng ‘ sẽ escape được!

Những input bên trên trả về giá trị true là do thằng mysql nó auto cast đoạn input sang số để query tiếp.

Cho dù input có là gì đi chăng nữa, chỉ cần nó bắt đầu bằng số và không bị kết thúc bởi ký tự nào đó có thể escape được input thì nó vẫn return true ;):

Việc tiếp theo là guess code behind the chatbot =))).

Mình đoán là đoạn “id” kia được lấy ra từ input thế này:

$id = explode(" ", $input)[1];

Sau đó để confirm, mình đã nhập thử input như sau:

chitiet 1234 ' => true

Nghĩa là “id” ko bị escape => ‘ ko nằm trong id => suy luận đúng hướng kmnr.

Vậy là mình đang đối mặt với 1 chal CTF dạng SQL Injection no whitespace!

Do trước đó mình cũng đọc kha khá là nhiều writeup của các tiền bối về cái này nên cũng biết chút ít…

Dưới đây là 2 SQL Inject query dự đoán sẽ return true/false mà mình sử dụng:

chitiet 1234'/**/and/**/(select(1))='1 => true

And… false:

chitiet 1234'/**/and/**/(select(1))='0 => false

Cũng khá là may mắn khi đoán phát trúng liền =))).

Tiếp tới là đoán số cột trong query!!

Ở đây mình có thử order by nhưng ko được:

Theo mình nghĩ thì đoạn input này chỉ nằm bên trong 1 subquery nào đó, nên khi comment đoạn query đằng sau nó sẽ làm hỏng cả query và return false là điều đương nhiên!!

Ở đây thì mình ko hề thích chuyện con ong chăm chỉ ngồi làm blind SQL Injection 1 chút nào, cho nên phải thử cách khác, find a smarter way!

Order by ko được, mình chuyển qua union select thẳng luôn, vì dù sao cũng là guess cả.

Thà guess 15–20 cái request rồi sung sướng còn hơn là ngồi đần ra blind cả trăm / nghìn cái request =)). Hơn nữa việc request bắt buộc phải nhắn tin cho page :))) => đòi hỏi attack càng nhanh càng tốt.

May be today is my lucky day :)).

Union select đến 3 column thì bot return cho mình như vậy:

Vậy có phải tốt hơn là ngồi blind cả trăm cái request ko!

Đến đây thì là gameover rồi, mysql version và username như phía dưới:

A piece of db ;) :

.

.

Chuyện gần như đã xong, ngoại trừ khi đang request dở thì admin fix và rep tin nhắn của mình =))):

Việc sử dụng auto bot trong bán hàng online ngày nay là 1 ý tưởng không tồi trong khi lượng user chỉ thích online fb và lười click vô website chính thống.

Nhưng như những gì đã từng được viết “Don’t any trust user input”, đừng bao giờ quên check input bất kể input đó đến từ đâu!

.

.

Hơi thất vọng 1 chút vì bỏ công ra làm mà chưa cả kịp viết mail …

Bot thì đã fix, …

“…Đơn côi mình ta vấn vương
Hồi ức trong men say chiều mưa buồn…

nightst0rm

NightSt0rm is a group of IT security researchers, enthusiasts , who share the same interests. We are focusing on Hacking, Cryptography, Malware analyst & Computer forensics.

Thu Nguyen

Written by

nightst0rm

NightSt0rm is a group of IT security researchers, enthusiasts , who share the same interests. We are focusing on Hacking, Cryptography, Malware analyst & Computer forensics.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade