前言
考试前临危不惧,写一篇博客总结下遇到的md5加密绕过问题,这种题型一般都是比较简单的。
sql注入问题
1 | $password=$_POST['password']; |
这个后端代码对password的输入做了md5编码,首先我们来看下md5()
这个函数:
1 | md5(string[,raw]): |
我们要知道以下两点:
- 数字和字符串比较时,若字符串从头开始的数字部分与数字相同,则返回true
- 以数字开头的字符串,若开头的字符不是0,那么在做逻辑运算的时候返回的是true
因此我们来看后端后端中的sql代码,若我们可以找到一个字符串,其md5后再转换回字符能够得到’or’加上一个非0字符的话,语句就可以看成:
1 | $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '' or true"; |
这就相当于一个万能密码了,绕过成功。因此记录下可以做到这个操作的字符串:
1 | ffifdyop |
不等变量的md5相等
弱类型可以使用0e开头的md5绕过:
1 | QNKCDZO |
顺便记录下sha1的:
1 | aaroZmOk |
强类型用数组绕过就可以了。
MD5碰撞
如果有强制类型转化无法使用数组的话,记录一些其他的可用字符串:
1 | $s1 = "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%6d%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%27%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%66%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%96%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%b3%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%ef%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%df%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%73%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%69%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%93%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%28%1c%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%b9%05%39%95%ab" |
总结
目前碰到的关于md5的问题基本都在这里了,如果有新的再进行记录。