PHP弱类型总结
<p><strong>0x01:“==”和“===”</strong></p><p>PHP中有两种比较符号,“==”与“===”。“==”我们称之为等值符,当等号两边为相同类型时,直接比较值是否相等;当等号两边类型不同时,先转换为相同的类型,再对转换后的值进行比较,如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照常数值进行比较。</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>("admin"==0);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">var_dump</span>("1admin"==1); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">var_dump</span>("admin1"==1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
<span style="color: rgba(0, 128, 128, 1)">var_dump</span>("admin1"==0) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">var_dump</span>("0e123456"=="0e4456789"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true </span>
?> </pre>
<pre>当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内<br>该字符串被当作int来取值,其他所有情况下都被作为float来取值,<strong>该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0</strong>。</pre>
</div>
<pre><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><strong>0x02:"array_search"与is_array"绕过<br></strong>is_array:判断传入的是不是一个数组,array_search(x,$数组):在数组中寻找与指定值(x)相等的值,array_search函数</span> <span style="color: rgba(0, 0, 0, 1)">类似于"==",会进行类型的转换<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['test'])){<span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">();}
</span><span style="color: rgba(128, 0, 128, 1)">$test</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['test'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span>=0;<span style="color: rgba(128, 0, 128, 1)">$i</span><<span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$test</span>);<span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$test</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>]==="admin"<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "error"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">();
}
</span><span style="color: rgba(128, 0, 128, 1)">$test</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>]=<span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$test</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">]);
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">array_search</span>("admin",<span style="color: rgba(128, 0, 128, 1)">$test</span>)===0<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "flag"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "false"<span style="color: rgba(0, 0, 0, 1)">;
}
</span>?></pre>
</div>
<pre>在上面的栗子中,我们可以传入test[]=0来进行绕过,首先test是一个数组,符合is_array的判断,然后test=0;在array_search中0==admin为true,绕过了array_search。</pre>
<pre><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><strong><span style="color: rgba(0, 0, 0, 1)"><br>0x03:strcmp漏洞绕过<br></span></strong><span style="color: rgba(0, 0, 0, 1)">strcmp是比较两个字符串,str1<str2,返回<0,str1>str2,返回>0,相等时返回等于0<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(128, 0, 128, 1)">$password</span>="***************"
<span style="color: rgba(0, 128, 128, 1)"> 3</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)">$_POST</span>['password'<span style="color: rgba(0, 0, 0, 1)">])){
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">strcmp</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['password'], <span style="color: rgba(128, 0, 128, 1)">$password</span>) == 0<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">echo</span> "Right!!!login success"<span style="color: rgba(0, 0, 0, 1)">;n
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> } <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">echo</span> "Wrong password.."<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">11</span> ?></pre>
</div>
<pre><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)">上述代码中要求我们post一个password值,要与给定的password变量的值相等,但我们不知道password变量的值是什么!这怎么办呢?<br>stamp期望传入的值是字符串类型,但如果我们传入数组类型会怎么样呢?<br>我们传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"><span style="color: rgba(0, 128, 128, 1)"><span style="color: rgba(0, 0, 0, 1)"><br></span>(ps:本人太菜,若有错误的地方欢迎大佬随时责骂。。。。xixixii)<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre><br><br>
来源:https://www.cnblogs.com/liangshian/p/10925792.html
頁:
[1]