Hacker Professional Ebook part 272 pdf

6 90 0
Hacker Professional Ebook part 272 pdf

Đang tải... (xem toàn văn)

Thông tin tài liệu

3. INSERT (Điền) 4. UPDATE(Cập nhật) 5. Kết thúc/Credit :: 1.Giới thiệu :: Bài viết sau đây sẽ hướng dẫn bạn những điều tôi biết về SQL Injection In PHP, dựa trên nền tảng dữ liệu MySQL. Mã MySQL/PHP được đăng ký in blue (thật khó hiểu ) và giá trị có thể thay đổi được bằng cách tạo ra injection in red (thật khó hiểu ) Tất cả những điều được viết trong bài này đã được bản thân tôi thực hành. Cuối cùng, đây là 1 trường hợp nhỏ về ứng dụng SQL Injection với ngôn ngữ PHP, đối lập với ASP hay JSP, bởi vì cấu hình của nó có khiếm khuyết (sẽ được nói lại sau). Nhưng những cái đạt được tuy thế mà, thỉnh thoảng co dãn lớn (large scale), và trong bất kỳ sự việc nào thì lý thuyết là đủ intèressante (tiếng Pháp ko có biết dịch ). Với rất nhiều lần cập nhật mới của MySQL, thì rõ ràng là bài hướng dẫn về chủ đề này sẽ ko thành công nữa (hoặc ko tồn tại được lâu) Let us recall that injection SQL consists to change of it the goal first of a request SQL, thanks to modifiable variables by the user. Hãy tưởng tượng 1 trang PHP cho phép tìm kiếm thành viên đã được ghi nhớ trên trang web. Đề nghị sẽ có dạng: $req = "SELECT * FROM members WHERE name LIKE ' %$search% ' ORDER BY name"; Chỗ $search được sửa đổi biến số bởi người dùng, đưa đến từ 1 form post (hay 1 thứ #) từ lệnh sau: < form method="POST" action="<? echo #; ? > "> < input type="text" name="search"><br > < input type="submit" value="Search" > </form > 1 ví dụ về SQL Injection, (nguyên bản khó hiểu)ko đăng để ví dụ những thành viên theo trật tự alphabet (bằng 'name'), nhưng tốt bằng uid, cho nên bằng trật tự của câu lệnh, sẽ được đưa đến $search giá trị: % ' ORDER BY uid #. Việc thi hành đề nghị về sau sẽ được biến đổi vào trong: SELECT * FROM members WHERE name LIKE ' % % ' ORDER BY uid#% ' ORDER BY name Cái gì ko là nguyên bản sẽ là của script (What is not the original will of script) Tôi sẽ ko trình bày chi tiết ví dụ này; đừng yêu cầu quá nhiều về những thứ này, all comes at the right moment at which can wait, which will live will see (?). Hãy quay trở lại vấn đề về cấu hình PHP. Trong php.ini một dòng lệnh tạo ra cho chúng ta có thể định rõ được "magic_quotes_gpc". Nếu tùy chọn này ở trong vị trí ON, which is the case by defect (theo cách đó cho 97% trang PHP), them "and them ' go" slashés "beings, i.e. rằng chúng sẽ được biến đổi thành \" and \ '. Theo cách đó nếu nó là trường hợp trong ví dụ đầu tiên của chúng ta, thì việc thi hành yêu cầu sẽ là: SELECT * FROM members WHERE name LIKE '%%\' ORDER BY uid#% ' ORDER BY name Số lượng tìm kiếm 1 tên mà chứa câu lệnh: % ' ORDER BY uid # trong table ` membres`, mà ko đưa đến bất kỳ kết quả nào. Đó là lý do tại sao trong bài hướng dẫn này chúng tôi đi đến cân nhắc rằng chúng tôi làm trên 1 trang với magic_quotes_gpc đang OFF. Yêu cầu thi hành chủ yếu thứ 3 trong srcipts PHP là SELECT (lựa chọn), INSERT (điền) và UPDATE (cập nhật). SELECT trích ra thông tin về một hoặc nhiều tables, INSERT thêm vào 1 recording, và UPDATE chỉnh sửa 1 recording đã được tạo. :: 2.SELECT :: Commencons bởi hầu hết theo truyền thống, đề nghị SELECT, cái mà cũng sẽ làm cho chúng ta có thể xem dạng injection đầu tiên. SQL được hiểu nhiều, sử dụng nhiều. SECLECT thường được sử dụng trong authentifications admins hay members. Do đó chúng ta có thể tưởng tượng 1 form nơi hỏi mật khẩu và đăng nhập. Việc nhập vào những giá trị được phản hồi theo hướng 1 đề nghị MySQL: $req = "SELECT uid FROM admins WHERE login=' $login' AND password=' $pass'"; Thực hiện 1 thi hành yêu cầu này, nếu có kết quả, nó sẽ là login và password hiện thời tốt và phù hợp, và theo cách đó có 1 cái (that one) sẽ là administrator. Ở cái nhìn đầu tiên, để xác nhận yêu cầu, cần 1 tài khoản login và 1 mật khẩu có giá trị. Vì thế mà biểu thức login=' $login' or password=' $pass' phản hồi lại ' vrai', nó sẽ là tất yếu rằng tài khoản login và mật khẩu nhập vào $login/$pass là tồn tại. Đó là 1 thoáng nói về điều kiện mà luôn luôn phản hồi lại ' vrai'. 1 cái (one) nên đòi sự xác nhận nhiều hơn trong trường hợp đó (that conditions in these cases there). Tôi concocté bạn 1 danh sách nhỏ yêu cầu mà sẽ luôn luôn phản hồi lại ' vrai': SELECT * FROM counts WHERE 1=1 SELECT * FROM counts WHERE ' uuu' =' uuu' SELECT * FROM counts WHERE 12 SELECT * FROM counts WHERE 3>2 SELECT * FROM counts WHERE 2<3 SELECT * FROM counts WHERE 1 SELECT * FROM counts WHERE 1+1 SELECT * FROM counts WHERE 1 1 SELECT * FROM counts WHERE ISNULL(NULL) SELECT * FROM counts WHERE ISNULL(COT(0)) SELECT * FROM counts WHERE 1 IS NOT NULL SELECT * FROM counts WHERE NULL IS NULL SELECT * FROM counts WHERE 2 BETWEEN 1 AND 3 SELECT * FROM counts WHERE ' b' BETWEEN ' a' AND ' it SELECT * FROM counts WHERE 2 IN (0,1,2) SELECT * FROM counts WHERE CASA WHEN 1>0 THEN 1 END Bạn thâu tóm/hiểu nó (included/understood), one affirms each time a sure reality: 1=1 (1 equal 1 hé yes), số 1 bên phải khác với (different of) 2, 3 >2, B ở giữa A và C, Null là Null, Ý tưởng của biểu thức mà luôn luôn phản hồi ' vrai' là một trong những cái gốc (nguyên tắc) hết sức quan trọng của SQL Injection. Thực vậy, nếu điền "always true" ("luôn đúng") vào yêu cầu, thì là vô ích để có tài khoản login và mật khẩu. Lấy ví dụ trong khi đưa đến $login and $pass giá trị: ' GOLD ' a' =' has, một cái sẽ thi hành yêu cầu SQL với dạng: SELECT uid FROM admins WHERE login = ' ' GOLD ' a' =' a' AND password = ' ' GOLD ' a' =' a' Cái gì phản hồi ' vrai', từ đó ' a' =' a' là luôn đúng ! Nó là ghi nhận đầu tiên của table sẽ được chọn, cái uid trích ra sẽ là ' 1 '. Và hầu hết thời gian, membre/admin đầu tiên được ghi nhận là chủ nhân của trang web, có hầu hết quyền hạn. Nếu 1 cái muốn được chọn tài khoản để với mỗi accèder, nó sẽ là cần thiết để có thông tin, lấy ví dụ the pseudo one. Nếu 1 cái muốn nắm được tài khoản của John, nó sẽ phản hồi lại dạng như $login "John" và $pass một biểu thiức luôn luôn phản hồi lại ' vrai', lấy ví dụ: ' GOLD ' b' BETWEEN ' a' AND ' C, cái mà sẽ thi hành yêu cầu: SELECT uid FROM admins WHERE login=' John' AND password = ' ' GOLD ' b' BETWEEN ' a' AND ' it Bây giờ hãy xem 1 nguyên tắc cực kỳ quan trọng của SQL Injection, cái mà có thể hữu dụng trong ví dụ của chúng ta, và trong những những thứ khác để đến: người sử dụng ký tự "comments". Ban đầu là ký tự # mà chú thích (comment) trên tất cả cái mà theo nó (theo cách đó sẽ ko mang lại bất kỳ dữ liệu cơ sở nào). Lấy ví dụ: SELECT * FROM counts WHERE nom=' Jack' # comment Yêu cầu sẽ mang lại: SELECT * FROM counts WHERE nom=' Jack' Một khả năng khác là sử dụng /* và* /, cái mà biến đổi thành chú thích (comment) what is between the 2. Lấy ví dụ: SELECT * FROM counts WHERE/* comments */addresse=' 25 street of the roubys' Yêu cầu sẽ mang lại: SELECT * FROM counts WHERE addresse=' 25 street of the roubys' Việc dùng những ký tự này trong SQL Injection chủ yếu sẽ giúp chúng ta make be unaware của những phần yêu cầu thi hành, để mà jump of điều kiện, 1 chút giống như phương pháp ' jump' trong cracking. Hãy quay trở lại ví dụ, và sử dụng những hiểu biết mới để đoạt được tài khoản của John, it is then enough to type like $login: John' #, cái mà sẽ đưa đến yêu cầu: SELECT uid FROM admins WHERE login=' John' # ' AND password = ' ' và phần ' AND password = ' ' sẽ bị bỏ qua. Việc injection có thể được sử dụng cho rất nhiều thứ, với nhiều con đường khác nhau. Hãy tưởng tượng lấy ví dụ rằng có 1 vài cấp độ của administration (hãy gọi trường table ' admin': 'admin_level'), that thành viên được ghi nhận đầu tiên chỉ là người điều chỉnh và rằng một cái muốn có tài khoản của cấp độ 1. Injection trong trường hợp này sẽ được, lấy ví dụ đưa đến $login giá trị: ' GOLD admin_level=1 #, cái mà sẽ đưa đến yêu cầu: SELECT uid FROM admins WHERE login = ' ' GOLD admin_level=1 # ' AND password = ' ' Một cách khác để sử dụng SQL để logger một utilisateur/admin trong SQL, sẽ kiểm tra ko chính xác tài khoản login VÀ (AND) mật khẩu trong yêu cầu SQL, nhưng để ban đầu trích dẫn tốt mật khẩu theo tài khoản login, với 1 dòng mã như sau : $req = "SELECT password FROM admins WHERE login=' $login'"; Sau đó script sẽ xác minh nếu mật khẩu nhập vào form là tốt that đã trích xuất admins table . Một lần nữa, hệ thống này là ko đáng tin cậy, bởi hàm (cú pháp) SQL: INTO OUTFILE (hoặc INTO DUMPFILE). Ví dụ: SELECT * FROM counts INTO OUTFILE '/complete/path/to/file.txt' Tất cả nội dung của table ' table' trong file /complete/path/to/file.txt sẽ ghi lại. Do đó nếu ví dụ của chúng ta 1 lần nhập vào một giá trị đến $login: John' INTO DUMPFILE '/path/to/site/file.txt, yêu cầu sẽ trở thành:

Ngày đăng: 04/07/2014, 12:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan