关于sql注入的一些小结
0x01 何为sql注入
结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。所谓的sql注入指的是通过web表单或者输入url界面或者与数据库交互的地方,通过提交构造的SQL语句,服务器端未经过严格的过滤从而执行了构造的SQL语句。
0x02 sql注入的危害
sql注入属于危害较高的一类漏洞,可以通过sql语句查询、修改、删除数据,脱裤。上传 webshell后门,远程执行命令。
0x03 sql类型
从数据参数上分为字符型和数字型,如何区分数字型和字符型。
字符型:select * from users where id =“1”;
数字型;select * from users where id = 1;
从注入手法上来分:
union注入:使用union连接两个sql语句查询,返回两个结果的并集,要求两个查询结果的列数一样.
报错注入:报错注入顾名思义主要是利用数据库报错来进行判断是否存在注入点。如果不符合数据库语法规则就会产生错误。
布尔注入:如果成功注入会正确显示内容,如果没成功会显示非正常内容。
延时注入:通过sleep()函数,注入成功网络会延迟,一般为if(length(database())>1,sleep(5),1),如果语句能执行,则延时5秒,否则返回1
二次注入:在存入数据库的时候做了过滤,但是取出来的时候没有做过滤,而产生的数据库注入。
宽字节注入:数据库大多数为GBK才可以%df
cookie注入:cookie中的参数也有可能存在注入
xff注入:X-Forwarded-for伪造客户端IP
load_file()读取文件操作,知道文件的绝对路径 能够使用 union 查询 对 web 目录有写的权限 union select 1,load_file(’/etc/passwd’),3,4,5# 0x2f6574632f706173737764 union select 1,load_file(0x2f6574632f706173737764),3,4,5# 路径没有加单引号的话必须转换十六进制 要是想省略单引号的话必须转换十六进制。
into outfile 写入文件操作,文件名必须是全路径(绝对路径) 用户必须有写文件的权限 没有对单引号’过滤。
select ‘<?php phpinfo(); ?>’ into outfile '‘D:\phpStudy\PHPTutorial\WWW\shell.php’
select ‘<?php @eval($_POST["admin"]); ?>’ into outfile
‘D:\phpStudy\PHPTutorial\WWW\shell.php’
0x04 sql注入的防御
1.使用PDO(数据对象)进行加固
把查询语句弄成一个对象,通过函数判断输入进来的值是否为数字,然后再通过正则替换内容
使用参数化查询可有效避免SQL注入
2.str_replace()函数替换过滤
单引号(’) 双引号(") 反斜杠(\) NULL进行过滤
3.htmlspecialchars()函数 实体化过滤
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为 ’
< (小于)成为 <
大于>成为 >
4.使用预编译语句
绑定变量使用预编译语句是预防SQL注入的最佳方式,因为使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,攻击者无法改变SQL语句的结构,从根本上杜绝了SQL注入攻击的发生。
5.使用strpos()函数在GET输入做判断是否存在关键字
例如:<?php
function foo($gjz)
{
$array = array("and", "or","union");
for ($i=0; $i < 2; $i++)
{
if (strpos($gjz,$array[$i])!== false)
{
die("警告");
}
}
return $arg;
}
?>
在数组array中定义关键字
上一篇: 手机虚拟机装kali
下一篇: java使用des加密