命令注入
对用户输入的命令不进行过滤或过滤不严格时,可以通过构造特殊的命令字符串将数据传递到后端,并利用该方式执行外部程序或系统命令实施攻击。
High
high难度的命令注入主要利用了黑名单验证的方式来达到一个过滤的效果。
对于个别函数这里做一个代码演示
array_keys:
当创建了一个数组后使用这个函数,可以看到打印出的是这个数组的键名,也就是说在这里arrat_keys函数用于将数组里的键名提出来。
str_replace:
我按照题中的格式添加了str_replace函数会有什么效果?执行一下试试。
当我分别输入'qwe'和'abc'时,发现只有'qwe'被成功打印出来,也就是说str_replace函数会将'abc'给替换成空。这样就理解了这个函数在本题的作用,用于对输入的字符串进行替换,当匹配到和键名相同的字符串时,会将其替换成空,进而实现了对字符串的过滤。
但是本题的黑名单内的 '| ' 是有空格的,只要用 '|' 构造命令时不要留空格即可实现绕过黑名单。
Impossible
这题不再使用黑名单过滤而是使用了白名单。
同样对几个关键函数进行解释
checktoken函数:主要是进行一个token验证,可以防止请求伪造。
explode函数:使用字符串对另一个字符串进行分割,并且以数组形式返回。这里演示的是以 ' . ' 作为分割符将2023.6.9进行了分割,并返回成数组。
is_numeric:用于检测变量是否为数字或数字字符。
这题的白名单验证配合各种函数的防护机制基本算是无解。