如图所示,为页面的根界面,未登录时自动进入此页面
点击注册,会进入注册页面,如下图所示. 注册成功之后会自动跳转到登录界面
注册成功之后,点击登录按钮,可以进入登录界面,如图所示
登录成功之后,进入如图所示的主界面
右上角有文件上传,SQL注入,反射型XSS,存储型XSS,CSRF,LOGOUT选项,不同选项具有不同功能
点击Fileload
选项,进入文件上传功能.如图所示
md5(uniqid(microtime(true),true))
重命名,来确保文件名不会重复uploads
文件夹,若该文件夹不存在会先创建此文件夹,再移动到此文件夹内点击SQL INJECTION选项,可以进入数据查询页面,如图所示
点击XSS REFLECT或者XSS SRORE 选项可以进入评论页面,如图所示
点击CSRF选项,进入如图所示界面,该界面可以更改密码
当点击LOGOUT
选项,会清空网站的所有session
//1.开启 Session session_start(); //2.判断是否未登录就访问此页面 if($_SESSION['loginsucess']!='wzx'){ echo"<script type='text/javascript'>alert('please log in ');location='login.html';</script>";} //3.销毁所有 Session,并跳转会最初的根页面 session_unset(); echo"<script>location='index.html';</script>"
在自己编写还未采用安全措施的网站上进行攻击
攻击者构造请求连接http://www.test.com/unsafeweb/csrf.php?newpass=qwert&confirmpass=qwert
然后通过一些手段欺骗用户点击
假设用户在登录状态时点击了此连接,就会导致攻击成功,用户的密码已经被更改,攻击如图所示
burpsuite
进行抓包可以得到,如下图所示$_SESSION['token'] = md5(microtime());
来变化的//1.将提交过来的token与服务端的比较 if(isset($_REQUEST['token'])){ if($_REQUEST['token']!=$_SESSION['token']){; echo"<script type='text/javascript'>alert('Token error');location='csrf.php';</script>";}} //2.判断验证码是否正确 if(isset($_REQUEST['authcode1'])){ if(strtolower($_REQUEST['authcode1'])!=$_SESSION['authcode1']){ echo"<script type='text/javascript'> alert('verification code error');location='csrf.php';</script>";}} //3.判断两次输入的密码是否相同 if($newpass==$confirmpass){ if(($newpass!='')&&($confirmpass!='')){ $md_pass=md5($newpass);//使用MD5 //4.将md5后的新密码放入数据库 $sql="update user set password='$md_pass' where id=5"; $result=mysqli_query($link,$sql); if($result){ echo "<script>alert('Alert sucess');window.location.href='csrf.php'</script>";}}}
验证请求的Referer
值
Referer
是以自己的网站开头的域名,则说明该请求来自网站自己,是合法的Referer
是其他网站域名或空白,就有可能是CSRF攻击,服务器应拒绝该请求在请求中放入攻击者不能伪造的信息
2.在用户名输入框中构造1' or 1=1#
,密码随便输入,验证码输入正确,如图所示
Login
,会显示登录成功,即注入成功,如图所示如下图所示页面,输入id,用来查询是否存在该用户,如果存在就返回用户名,不存在就返回空,该页面存在数字型注入漏洞
在页面中输入4 and 1=1#
返回用户名
输入4 and 1=2#
不返回结果.由此得出该页面存在数字型注入漏洞
输入4 order by 4#
返回值,如下图所示;输入4 order by 5#
不返回结果,由此得出字段名由4个
输入-1 union select 1,2,3,4#
,只输出2,表明第二个字段明会输出结果
输入-1 union select 1,(select database()),3,4#
,返回了数据库的名字
输入-1 union select 1,(select table_name from information_schema.tables where table_schema='member' limit 1,1),3,4#
查询到表名一个表名为user
输入-1 union select 1,(select column_name from information_schema.columns where table_schema='member' and table_name='user' limit 2,1),3,4#
得到一个字段名为password
,同理可以获得字段名id,username,email
输入-1 union select 1,(select password from member.user where id=4),3,4#
得到id为4的用户的密码为b0baee9d279d34fa1dfd71aadb908c3f
,密码使用了MD5,可以使用彩虹表破解,破解后为11111
-1 union select 1,(select password from member.user where id=4),3,4#
,但是这次没有返回值5.使用id来查询的预编译代码如下所示:
//根据输入的id来查询用户名(使用预编译) $id=$_POST['id']; if($id!=''){ $sql="select * from user where id =?"; $stmt = $link->prepare($sql); $stmt->bind_param("i",$id); $stmt->execute(); $result=$stmt->get_result(); if($result){ $rows = mysqli_fetch_array($result); echo "<p style='margin: auto;width:320px;color: #bce8f1'>'username:'$rows[1]<br/></p>"; } }
过滤危险字符
使用预编译语句,绑定变量
使用存储过程
检查数据类型
1.在下面界面输入<script>alert("xss")</script>
1.在下面界面输入<script>alert("xss")</script>
2.点击comment,会显示xss,当再刷新页面,还会显示该弹窗
//1.对传入的字符串str进行Html encode转换 $str_com=''; if ($comment !=null && $comment.trim()!=""){ for ($i = 0, $len=strlen($comment); $i < $len; $i++) { $arr1 = str_split($comment); switch($arr1[$i]) { case '&': $str_com.="&"; break; case '<': $str_com.="<"; break; case '>': $str_com.=">"; break; case '"': $str_com.="""; break; case ' ': $str_com.=" "; break; case '%': $str_com.=""; break; default: $str_com.= $arr1[$i]; } } }
<
,>
,'
,"
,等HTMLEncode
等编码方式如下图所示,为文件上传,该页面只允许上传图片类型
但是它的源码中只使用了$_FILE['myFile']['type']
来判断类型
$type=$_FILES['myFile']['type']; $allowExt=array('jpeg','jpg','png','gif'); if(!in_array($type,$allowExt)){ echo"<script>alert('非法文件类型');window.location.href='do_upload.html'</script>"; }
$_FILE['myFile']['type']
是根据客户端发送过来的数据中Content-Type来判断类型,因此可以绕过
如下图上传图片类型的文件,而是扩展名为txt的文本文件
上传时使用burpsuite
抓包,可以看到Content-Type的类型为text
将text类型改为image/png
然后将数据发送,显示上传成功
在上传目录uploads内可以发现此txt文件,文件经过了重命名
如下图上传一个pptx类型的文件
使用burpsuite
抓包,并修改Content-Type数据
但是上传失败
文件上传检测部分代码如下所示:
$_FILES['myFile']['type']
判断文件类型,只允许图片类型$ext
变量用来判断文件扩展名是否为$allowExt
白名单中的类型,防止$_FILES['myFile']['type']
被绕过is_uploaded_file($tmp_name)
用来只允许post传过来的文件getimagesize($tmp_name)
用来防止其他类型的文件更改后缀名,伪造成图片类型来上传$uniName=md5(uniqid(microtime(true),true)).'.'.$ext
用来重命名,并确保文件名不会重复.php.png
等这种多重扩展名的文件//1.将文件属性赋值给变量 $filename=$_FILES['myFile']['name']; $type=$_FILES['myFile']['type']; $tmp_name=$_FILES['myFile']['tmp_name']; $size=$_FILES['myFile']['size']; $error=$_FILES['myFile']['error']; $allowExt=array('jpeg','jpg','png','gif');//允许上传类型白名单 //2.规定文件最大大小 $maxSize=2097152;//(2M) if($error==0){ if($size>$maxSize){ echo"<script>alert('上传文件过大');window.location.href='do_upload.html'</script>"; } //3.检查扩展名,如果扩展名不在规定的白名单内就禁止上传 $ext=pathinfo($filename,PATHINFO_EXTENSION); if(!in_array($ext,$allowExt)){ echo"<script>alert('非法文件类型');window.location.href='do_upload.html'</script>"; } //4.检查是否通过http post过来 if(!is_uploaded_file($tmp_name)){ echo"<script>alert('文件不是通过HTTP POST方式上传过来的'); window.location.href='do_upload.html'</script>"; } //5.检测是否是真的图片类型,不能是.txt改成.jpg等类似此种情况 //getimagesize可以检测是否为图片,如果不是返回false $flag=true; if($flag){ if(!getimagesize($tmp_name)){ echo"<script>alert('不是真正的图片类型');window.location.href='do_upload.html'</script>"; } } //6.检查是否存在uploads目录,没有文件就创建一个 $path='uploads'; if(!file_exists($path)){ mkdir($path,0777,true); chmod($path,0777); } //7.重命名文件,并确保文件名唯一 $uniName=md5(uniqid(microtime(true),true)).'.'.$ext;// $destination=$path.'/'.$uniName; //@ 错误抑制符 //8.移动文件到指定的目录 if(@move_uploaded_file($tmp_name,$destination)){ echo"<script>alert('上传成功');window.location.href='do_upload.html'</script>"; }else{ echo"<script>alert('上传失败');window.location.href='do_upload.html'</script>"; } }
.shell.php.rar
,crossdomain
这种文件所实施的攻击无法成功crossdomain.xml
,上传包含JavaScript
的XSS
利用等问题将得到解决通过这次课程,我可以更灵活的使用的php
语言来编程了,此外对前端的HTML
,CSS
,Javascript
也有了一个大致的了解.
以前我对针对web攻击的防御策略只是停留在理论阶段,只是知道如何防御,不知道怎么写出代码,这个课程让我学会了实践上的防御攻击,让我对这些web攻击有了更加深刻的认识,也更加明晰了攻击原理,以及各种函数的漏洞利用you
此外,这门课程还让我又一次详细的复习了WEB安全,让我把忘在角落里的碎片知识重新捡了起来,收获颇丰.
网站源码
解压密码为:Alucardlink