Tuy nhiên qua kiểm thử mình thấy những cách này đều thể rõ là không hiệu quả và thực tế chỉ là che mắt người thường chứ thực chất không có tác dụng gì trong việc chống tấn công tôi sẽ lấy ví dụ cụ thể minh họa cho từng trường hợp
Một số trang website cho rằng dùng mã sau đây có thể chặn tấn công sql injection
RewriteCond %{QUERY_STRING} UNION([%20 /*+]*)ALL([%20 /*+]*)SELECT [NC,OR]
RewriteCond %{QUERY_STRING} UNION([%20 /*+]*)SELECT [NC,OR]
RewriteCond %{QUERY_STRING} /* [NC,OR]
RewriteCond %{QUERY_STRING} */ [NC]
RewriteRule ^.* - [F]
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
RewriteCond %{QUERY_STRING} http:.*/.*/ [OR]
RewriteCond %{QUERY_STRING} ..*/ [OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
RewriteCond %{QUERY_STRING} [^a-z](declare|char|set|cast|convert|delete|drop|exec|insert|meta|script|select|truncate|update)[^a-z] [NC]
RewriteRule (.*) - [F]
Nhùn có vẻ rờm rà và khủng đấy nhưng chúng ta chỉ chú ý đoạn code sau
RewriteCond %{QUERY_STRING} [^a-z](declare|char|set|cast|convert|delete|drop|exec|insert|meta|script|select|truncate|update)[^a-z] [NC]
Đoạn mã này cho chúng ta thấy rằng sẽ xóa tất cả các ký tự có trong link như set|cast|convert|delete|drop|exec|insert|meta|script|select|truncate|update
vậy một vấn đề nếu tôi dùng đoạn code như sau
http://example.com/detail.php?id=-1 UNIunionON SEselectLECT 1,2,3,4,5-- -
Chú ý tôi đang dùng UNIunionON SEselectLECT sau khi đi qua .htaccess xóa các ký tự có trong link như trên thì nó lại vẫn còn nguyên UNION SELECT vậy là firewall của bạn chả có ý nghĩa gì ở đây!
Rõ ràng đoạn code trên thực tế không có tác dụng gì trong việc ngăn chặn cả nó chỉ là làm mầu!
Chống tấn công LFI
Một số trang bạn có thể tìm thấy trên google sẽ thấy dùng đoạn code sau để tránh LFI
########## Begin - File injection protection
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(..//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]
########## End - File injection protection
- Bạn có thể thêm dòng sau đây để tránh trường hợp attacker mã hóa url
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http%3A%2F%2F [OR]
Code trên sẽ có tác dụng khi bạn nhập link cóp dạng
http://example.com/index.php?page=../../../etc/passwd
Tuy nhiên đối với cách này thì chúng ta có thể lợi dụng tính năng mã hóa url và sử dụng Double encoding để tấn công vô hiệu hóa ngay cái .htaccess của bạn phía trên
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
Bạn có thể tham khảo một số Playload bypass tại đây để biết thêm chi tiết
.cchặn xss?
RewriteCond %{QUERY_STRING} http://([a-zA-Z0-9_-]*) [NC,OR]
RewriteCond %{QUERY_STRING} http:/([a-zA-Z0-9_-]*) [NC,OR]
RewriteCond %{QUERY_STRING} cmd= [NC,OR]
RewriteCond %{QUERY_STRING} &cmd [NC,OR]
RewriteCond %{QUERY_STRING} exec [NC,OR]
RewriteCond %{QUERY_STRING} execu [NC,OR]
RewriteCond %{QUERY_STRING} concat [NC]
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]
RewriteCond %{THE_REQUEST} ^.*(
|
|%0A|%0D).* [NC,OR]
RewriteCond %{HTTP_REFERER} ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC,OR]
RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC,OR]
RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|">|"<|/|\..\).{0,9999}.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww-perl|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(;|<|>|'|"|)|%0A|%0D|%22|%27|%3C|%3E|).*(/*|union|select|insert|cast|set|declare|drop|update|md5|benchmark|print|printf|system|exec|scanf).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(locdang.com|loopback|127.0.0.1).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC]
RewriteRule ^.* - [F]
Đoạn code trên thường được cho rằng chặn được xss tuy dài vậy nhưng chúng ta chỉ cần chú ý đoạn
RewriteCond %{HTTP_REFERER} ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC,OR]
RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|).* [NC,OR]
RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|">|"<|/|\..\).{0,9999}.* [NC,OR]
REQUEST_URI nó chỉ qua tâm tới các dấu ></ mà quên mất rằng chúng có mã hóa và bypass tương tự LFI các bạn có thể tìm thấy list các cách bypass ở các link sau:
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
https://84692bb0df6f30fc0687-25dde2f20b8e8c1bda75aeb96f737eae.ssl.cf1.rackcdn.com/--xss.html
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20injection/XSS%20in%20Angular.md
Qua thực tế thì mình thấy các cách trên mạng thực chất chỉ là có cho đẹp nó không có tác dụng khi bạn bị tấn công có chủ ý. Chính vì thế đừng ảo tưởng về sức mạnh của file .htaccess
Không có nhận xét nào:
Đăng nhận xét