//ex1.php "; system("ls -al ".$dir); echo ""; } ?>
我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd
提交以后,命令变成了 system("ls -al | cat /etc/passwd");
mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候 //ex2.php
当我们提交 http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了
动态函数
程序员原意是想动态调用A和B函数,那我们提交http://www.sectop.com/ex.php?func=phpinfo 漏洞产生
防范方法
尽量不要执行外部命令
使用自定义函数或函数库来替代外部命令的功能
使用escapeshellarg函数来处理命令参数
使用safe_mode_exec_dir指定可执行文件的路径
esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”
用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内
safe_mode = On
safe_mode_exec_di r= /usr/local/php/bin/
客户端脚本植入
客户端脚本植入(Script Insertion),是指将可以执行的脚本插入到表单、图片、动画或超链接文字等对象内。当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击。
可以被用作脚本植入的HTML标签一般包括以下几种:
";
?>
当我们具有admin权限,提交http://localhost/manage/delbook.php?id=2 时,就会删除id为2的留言
利用方法:
我们使用普通用户留言(源代码方式),内容为
插入4张图片链接分别删除4个id留言,然后我们返回首页浏览看,没有什么变化。。图片显示不了
现在我们再用管理员账号登陆后,来刷新首页,会发现留言就剩一条,其他在图片链接中指定的ID号的留言,全部都被删除。
攻击者在留言中插入隐藏的图片链接,此链接具有删除留言的作用,而攻击者自己访问这些图片链接的时候,是不具有权限的,所以看不到任何效果,但是当管理员登陆后,查看此留言,就会执行隐藏的链接,而他的权限又是足够大的,从而这些留言就被删除了
修改管理员密码
//pass.php if($_GET["act"]) { $username=$_POST["username"]; $sh=$_POST["sh"]; $gg=$_POST["gg"]; $title=$_POST["title"]; $copyright=$_POST["copyright"]."
设计制作:厦门随缘网络科技"; $password=md5($_POST["password"]); if(empty($_POST["password"])) { $sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } else { $sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } mysql_query($sql); mysql_close($conn); echo ""; }
这个文件用于修改管理密码和网站设置的一些信息,我们可以直接构造如下表单:
存为attack.html,放到自己网站上http://www.sectop.com/attack.html,此页面访问后会自动向目标程序的pass.php提交参数,用户名修改为root,密码修改为root,然后我们去留言板发一条留言,隐藏这个链接,管理访问以后,他的用户名和密码全部修改成了root
防范方法
防范CSRF要比防范其他攻击更加困难,因为CSRF的HTTP请求虽然是攻击者伪造的,但是却是由目标用户发出的,一般常见的防范方法有下面几种:
1、检查网页的来源
2、检查内置的隐藏变量
3、使用POST,不要使用GET
检查网页来源
在//pass.php头部加入以下红色字体代码,验证数据提交
if($_GET["act"]) { if(isset($_SERVER["HTTP_REFERER"])) { $serverhost = $_SERVER["SERVER_NAME"]; $strurl = str_replace("http://","",$_SERVER["HTTP_REFERER"]); $strdomain = explode("/",$strurl); $sourcehost = $strdomain[0]; if(strncmp($sourcehost, $serverhost, strlen($serverhost))) { unset($_POST); echo ""; } } $username=$_POST["username"]; $sh=$_POST["sh"]; $gg=$_POST["gg"]; $title=$_POST["title"]; $copyright=$_POST["copyright"]."
设计制作:厦门随缘网络科技"; $password=md5($_POST["password"]); if(empty($_POST["password"])) { $sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } else { $sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"; } mysql_query($sql); mysql_close($conn); echo ""; }
检查内置隐藏变量
我们在表单中内置一个隐藏变量和一个session变量,然后检查这个隐藏变量和session变量是否相等,以此来判断是否同一个网页所调用
"; echo "alert(‘数据来源异常!');"; echo " location='index.php';"; echo ""; }} …… ">