Hướng dẫn dùng evaluate function trong PHP

  • Hàm eval () trong PHP
      • Ví dụ
    • Định nghĩa và Cách sử dụng
    • Cú pháp
    • Giá trị tham số
    • Chi tiết kỹ thuật
      • Related posts:

❮ Tham chiếu khác PHP

Ví dụ

Đánh giá một chuỗi dưới dạng mã PHP:

<?php
$string = “beautiful”;
$time = “winter”;

$str = ‘This is a $string $time morning!’;
echo $str. “<br>”;

eval(“\$str = \”$str\”;”);
echo $str;
?>

Đầu ra của đoạn mã trên sẽ là:

This is a $string $time morning!
This is a beautiful winter morning!


Định nghĩa và Cách sử dụng

Hàm eval () đánh giá một chuỗi dưới dạng mã PHP.

Chuỗi phải là mã PHP hợp lệ và phải kết thúc bằng dấu chấm phẩy.

Lưu ý: Một câu lệnh trả về sẽ chấm dứt việc đánh giá chuỗi ngay lập tức.

Mẹo: Hàm này có thể hữu ích để lưu trữ mã PHP trong cơ sở dữ liệu.


Cú pháp

Giá trị tham số

ParameterDescription
phpcode Required. Specifies the PHP code to be evaluated

Chi tiết kỹ thuật

Giá trị trả lại:Trả về NULL trừ khi một câu lệnh trả về được gọi trong chuỗi mã. Sau đó, giá trị được truyền để trả về được trả về. Nếu có lỗi phân tích cú pháp trong chuỗi mã, eval () trả về FALSE.
Phiên bản PHP:4+

❮ Tham chiếu khác PHP

botvietbai.com

BCK là giải pháp tích hợp thanh toán MOMO, ViettelPay, VNPay, Vietcombank, Vietinbank, Techcombank, MB.. dành cho cá nhân !

Eval () lưu trữ mã trong một cơ sở dữ liệu để thực hiện sau

PHP eval () xây dựng được sử dụng để đánh giá một chuỗi đầu vào như PHP và sau đó xử lý nó như vậy. Hàm Eval () không phải là một hàm, nhưng nó hoạt động giống như một hàm theo nghĩa nó xuất ra mọi thứ — ngoại trừ thay vì xuất nó thành văn bản, nó xuất ra dưới dạng mã PHP được thực thi. Một sử dụng của eval () xây dựng là để lưu trữ mã trong một cơ sở dữ liệu để thực thi sau này.

Ví dụ về Eval () Language Construct

Đây là một ví dụ đơn giản về mã hóa cho cấu trúc ngôn ngữ eval ().

> "; eval (" \ $ a = \ "$ a \"; "); in $ a." ";?>

Đoạn mã ví dụ này kết quả đầu ra Bạn bè của tôi là $ name và $ name 2 khi lần đầu tiên được gọi với lệnh in, và kết quả đầu ra Bạn bè của tôi là Joe và Jim khi được gọi lần thứ hai sau khi chạy eval ().

Yêu cầu và đặc điểm của Eval ()

  • Mã được truyền không thể được bao bọc trong việc mở và đóng các thẻ PHP.
  • Mã được chuyển phải là PHP hợp lệ.
  • Tất cả các câu lệnh phải được chấm dứt bằng dấu chấm phẩy.
  • Một câu lệnh return trả về việc đánh giá mã.
  • Bất kỳ biến được xác định hoặc thay đổi trong eval () vẫn còn sau khi nó chấm dứt.
  • Một lỗi nghiêm trọng xảy ra trong mã được đánh giá là gì, tập lệnh sẽ thoát.
  • Bởi vì eval () là một ngôn ngữ xây dựng và không phải là một hàm, nó không thể được sử dụng trong các hàm bậc cao hơn.

Nguy hiểm khi sử dụng Eval ()

Hướng dẫn sử dụng PHP không khuyến khích sử dụng cấu trúc eval (), nhấn mạnh việc sử dụng nó là "rất nguy hiểm" vì có thể thực thi mã PHP tùy ý. Người dùng được hướng dẫn sử dụng bất kỳ tùy chọn nào khác ngoài eval () trừ khi điều đó là không thể.

Việc sử dụng PHP eval () xây dựng trình bày các rủi ro bảo mật.

Hàm eval() trong PHP có cú pháp như sau.

eval ( string $code ) :mixed

Theo như định nghĩa từ trang chủ của PHP.

Tham khảo: https://www.php.net/manual/en/function.eval.php

Nôm na thì hàm này sẽ nhận đầu vào là một string và xem nó như một đoạn code trong PHP và thực thi nó (nếu được). Vì chức năng này nên nếu ứng dụng WEB sử dụng hàm này để xử lí input người dùng mà không kiểm tra cẩn thận thì sẽ dễ dẫn đến ứng dụng WEB sẽ bị attacker khai thác và có thể dẫn đến RCE.

Ví dụ về hàm eval().

Ta có thể thấy nó đã thực thi câu lệnh echo(123);

Trong khi chơi CTF thì mình gặp khá nhiều bài về hàm này. Nên mình sẽ làm một bài cụ thể để có thể hiểu thêm về hàm này.

Link challenge: https://websec.fr/level22/index.php

Vào bài ta được như một giao diện như trên. Và bài này đã cho sẵn source-code nên ta sẽ đi đọc và phân tích nó.

Bài cho ta gửi một tham số code lên, thông qua phương thức GET, và server sẽ chỉ lấy 21 kí tự, thông qua hàm substr() ở trên.

Tiếp đến mình thấy nó tạo một class A và include file_containing_the_flag_parts.php này vào. Chắc flag nằm trong này :)). Tạm thời chưa hiểu đoạn này làm gì, bỏ qua đọc tiếp.

Ta thấy là nó sử dụng hàm eval() ở đây để thực thi biến $code, biến này là do ta gửi lên. Nhưng nó sẽ không dễ dàng như vậy, mà có thể thấy là một cái blacklist dài ngoằn đằng trên nhằm filter $code.

Để bypass đc đống blacklist ở trên thì chúng ta phải sử dụng kí tự ~ trong PHP. Kí tự nhằm đảo ngược một string. Khi ta đảo ngược nó sẽ trả về một kí tự ko phải kí tự dạng alphabet nên có thể bypass đống blacklist trên.

Mình đã chạy đc phpinfo() rồi.

${~%A0%B8%BA%AB}{0} == $_GET[0]

Giờ tìm cách đọc flag, nhưng tên file khá dài nên ko đọc được. Giờ để ý cái class A. Đề cho vậy chắc có mục đích, nên var_dump($a) xem có gì.$a là một object từ class A.

Flag đã xuất hiện.

Post navigation