Tôi đang viết một số kiểm tra đơn vị để đảm bảo mã của tôi không dễ bị tấn công SQL dưới nhiều bộ ký tự khác nhau.Làm thế nào để tạo ra một cuộc tấn công SQL injection với Shift-JIS và CP932?
Theo this answer, bạn có thể tạo một lỗ hổng bằng cách tiêm \xbf\x27
bằng một trong những bảng mã sau: big5
, cp932
, gb2312
, gbk
và sjis
này là bởi vì nếu escaper của bạn không được cấu hình một cách chính xác, nó sẽ thấy 0x27
và cố gắng thoát khỏi nó sao cho nó trở thành \xbf\x5c\x27
. Tuy nhiên, \xbf\x5c
thực tế là một ký tự trong các bộ ký tự này, do đó báo giá (0x27
) không bị thoát.
Như tôi đã khám phá qua thử nghiệm, tuy nhiên, điều này không hoàn toàn đúng. Nó hoạt động cho big5
, gb2312
và gbk
nhưng không phải 0xbf27
hoặc 0xbf5c
là các ký tự hợp lệ trong sjis
và cp932
.
Cả
mb_strpos("abc\xbf\x27def","'",0,'sjis')
và
mb_strpos("abc\xbf\x27def","'",0,'cp932')
Return 4
. tức là, PHP không thấy \xbf\x27
là một ký tự đơn. Điều này trả về false
cho big5
, gb2312
và gbk
.
Ngoài ra, đây:
mb_strlen("\xbf\x5c",'sjis')
Returns 2
(nó trả 1
cho gbk
).
Vì vậy, câu hỏi đặt ra là: có một chuỗi ký tự khác làm cho sjis
và cp932
dễ bị tiêm SQL hay không thực sự là không phải là dễ bị tổn thương không? hoặc là nói dối PHP, tôi hoàn toàn nhầm lẫn, và MySQL sẽ giải thích điều này hoàn toàn khác nhau?
Tôi đã nhìn thấy SQL injection này với [Node.JS] (http://meta.security.stackexchange.com/a/2243/25859) khi tham gia vào một CTF. [Lý thuyết là có (trang 34)] (https://www.ipa.go.jp/files/000017321.pdf) về cách nó hoạt động nhưng tôi dường như không thể tái tạo nó trong PHP. Thông tin thêm về những gì tôi đã thử [trong phòng chat php] (http://chat.stackoverflow.com/transcript/message/29401516#29401516). Tôi sẽ đặt một tiền thưởng cho câu hỏi này cho bất cứ ai có thể cung cấp một cách cụ thể/thiết lập để khai thác điều này trong PHP. – HamZa
Luôn kiểm tra mã của bạn. Tuy nhiên, nếu bạn thực sự muốn làm cho ứng dụng của bạn an toàn hơn so với SQL injection, bạn có thể muốn sử dụng các câu lệnh đã chuẩn bị trong Cổng của bạn và gửi sql và dữ liệu cho DB một cách riêng biệt. mysqli và pdo đều hỗ trợ phương pháp xử lý sự cố này. Sử dụng câu lệnh đã chuẩn bị cũng có thể giúp bạn tăng tốc đáng kể khi Bạn lặp lại thực thi cùng một câu lệnh với nhiều dữ liệu khác nhau. http://stackoverflow.com/questions/8263371/how-can-prepared-statements-protect-from-sql-injection-attacks – Max
Cách duy nhất để ngăn chặn các cuộc tấn công SQL injection là sử dụng các truy vấn được tham số hóa thay vì chuỗi nối và thay thế. Không có số lượng thoát là sẽ sửa lỗi này. Nó cũng dễ dàng hơn để viết mã truy vấn tham số hơn là sử dụng thao tác chuỗi. Sự tồn tại của cuộc gọi 'mb_strpos' đó có nghĩa là mã dễ bị tấn công bởi các lệnh tiêm –