php字符长度函数漏洞 ctf,CTF中常见php-MD5()函数漏洞
CTF中常見php-MD5()函數(shù)漏洞
1.數(shù)字與字符串之間的比較
var_dump( 0 == "a" );
var_dump( "0" == "a" );
第一個(gè)返回的是 true ,第二個(gè)返回的是 false
因?yàn)閜hp把字母開頭的轉(zhuǎn)化為整型時(shí),轉(zhuǎn)化為0, 前面數(shù)字后面字母的話就只取到第一個(gè)字母出現(xiàn)的位置之前(如intval(’'123abd45gf)結(jié)果為123)
2.MD5函數(shù)漏洞
$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])
要求滿足上述條件則
那么要求name和password數(shù)值不同但是MD5相同,在這里可以利用繞過(guò)。
PHP在處理哈希字符串時(shí),它把每一個(gè)以“0E”開頭的哈希值都解釋為0,所以如果兩個(gè)不同的密碼經(jīng)過(guò)哈希以后,其哈希值都是以“0E”開頭的,那么PHP將會(huì)認(rèn)為他們相同,都是0。
以下值在md5加密后以0E開頭:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
以下值在sha1加密后以0E開頭:
sha1(‘a(chǎn)aroZmOk’)
sha1(‘a(chǎn)aK1STfY’)
sha1(‘a(chǎn)aO8zKZF’)
sha1(‘a(chǎn)a3OFF9m’)
GET傳入a=QNKCDZO&b=240610708就能繞過(guò)了
3.php特性
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
在php中===為完全等于運(yùn)算,不僅比較值,而且還比較值的類型,只有兩者一致才為真。再次使用a=QNKCDZO&b=240610708就不行了,因?yàn)閍和b類型不同。
PHP中md5的函數(shù)特性
md5([1,2,3]) == md5([4,5,6]) == NULL
[1] !== [2] && md5([1]) === md5([2])
所以GET傳入a[]=1&b[]=2就能夠繞過(guò)了。
4.MD5碰撞
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!);
}
要求構(gòu)造param1和param2不同,但是MD5相同,也就是說(shuō)要求傳入兩個(gè)MD5相同的不同字符串。
Param1=%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%a2
Param2=%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
MD5值相同使用谷歌可以搜到相當(dāng)多被巧妙構(gòu)造出的二進(jìn)制文件,其MD5相同,注意一點(diǎn),post時(shí)一定要urlencode!!!
總結(jié)
以上是生活随笔為你收集整理的php字符长度函数漏洞 ctf,CTF中常见php-MD5()函数漏洞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java编程实现素数环_结对编程(JAV
- 下一篇: java 浏览器 爬虫_java 网络编