一、SQl注入漏洞
1.漏洞原理
web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL语句原来的功能和逻辑。黑客利用此漏洞执行恶意的SQL语句,如查询数据、下载数据,写webshell、执行系统命令以此来绕过登录权限限制等
2.漏洞产生的威胁
1.猜解后台数据库数据,盗取数据库中存储的敏感信息
2.绕过验证,绕过验证登录网站后台
3.注入可以借助数据库存储过程进行提权等操作
3.漏洞分类
3.1根据输入的 「参数」类型
「数值型」注入:前台页面输入的参数是「数字」。
「字符型」注入:前台页面输入的参数是「字符串」。
3.2根据数据的「提交方式」分类
GET注入:使用get请求提交数据,比如 xxx.php?id=1.
POST注入:使用post请求提交数据,比如表单。
Cookie注入:使用Cookie的某个字段提交数据,比如在Cookie中保存用户信息。
HTTP Header注入:使用请求头提交数据,比如检测HTTP中的源地址、主机IP等。
3.3根据页面「是否回显」分类
显注:前端页面可以回显用户信息,比如 联合注入、报错注入。
盲注:前端页面不能回显用户信息,比如 布尔盲注、时间盲注。
4.SQL注入常用函数及含义
4.1 substr()函数
substr()函数,意为substr(string,start,length) 对于给定的字符串string,从start位开始截取,截取length的长度。
4.2 ascii()函数
ascii()就是返回字符的ascii码
4.3 exp()数字函数
用于计算e的x次方的函数。e为底数,x为指数。
4.4 extractvalue()函数
extractvalue()函数,extractvalue(XML_document, XPath_string),XML_document是String格式,为XML文档对象的名称;
XPath_string(Xpath格式的字符串),注入时可操作的地方。
5.SQL注入防御手段
1.使用预编译语句(Prepared Statements)和参数化查询:这是预防SQL注入的最有效方法之一,通过这种方式,可以确保SQL语句的结构在编译时就确定下来,之后传入的参数不会改变语句的结构,因此可以避免注入攻击。
2.使用存储过程:存储过程也可以像预编译语句一样防止SQL注入,因为它们同样使用参数化查询。
3.使用ORM(对象关系映射)工具:许多现代编程框架提供了ORM工具,它们可以自动进行参数化查询,从而降低直接编写SQL语句的风险。
4.验证用户输入:对所有用户输入进行验证,拒绝不符合预期格式的输入,可以减少注入攻击的风险。
5.使用适当的错误处理机制:不要在错误信息中透露敏感信息,以免给攻击者提供攻击线索。
6.限制数据库权限:为应用程序使用的数据库账户只赋予必要的权限,避免使用具有高级权限的账户,这样即使发生注入攻击,攻击者能做的也非常有限。
7.定期更新和打补丁:保持数据库管理系统(DBMS)更新到最新,修补已知的安全漏洞。
8.使用Web应用防火墙(WAF):WAF可以帮助识别和阻挡SQL注入攻击。
9.定期进行安全审计和代码审查:检查潜在的安全漏洞,及时修复。
10.使用参数化查询:无论何时,只要可能都应该使用参数化查询,而不是拼接SQL字符串。
6.SQL注入常用绕过waf的方法
1.变换大小写
2.编码
3.利用注释符
4.重写
5.比较操作符替换
6.同功能函数替换
7.SQLi的手工注入的步骤
1.判断是否存在注入点
可能的地方:
登录 注册 留⾔ 验证⽤户身份所属 查询某⽇xx信息 订单操作
2. 判断字段数量
在注⼊点后⾯添加语句【 order by int】,int的值可以是任意数字,但是⼀个数据表的字段数量通常不超过10,若传的int值⼩于等于字段数量则正常回显,若⼤于字段数量,则⽆法正常回显
3.判断字段前端回显位置
在链接后⾯添加语句【 union select 1,2,3,4,5,6,7,8,9,10,#】进⾏联合查询来暴露可查询的字段号,看哪些字段是可以返回给我们前端进⾏渲染的,不进⾏返回的字段我们⽆法利⽤
4.判断数据库信息
5.查找数据库名
6.查找数据库表名
union select group_concat(table_name) from information_schema.tables where
table_schema=database()--+
7.查找列名
-1' union select 1,(select group_concat(column_name) from information_schem
a.columns where table_name='biaoming'),3,4#
8.查数据
-1' union select 1,(select columnsname from tablename),3,4#
8.攻击靶场
第一关:
先加入参数id
加单引号判断闭合,发现为字符型注入
使用order by 判断数据库有几列:3列回显正常,4列出现报错,说明只有3列。
使用联合查询union select 判断回显位置
发现2,3的回显,判断数据库名称
查询到库名后查询库下所有表
判断users表中下的字段名称
查询字段中的数据
第二关:
加入参数id,加入单引号判断闭合错误,数字型注入
则为数字型注入
使用order by 判断数据库有几列
使用联合查询union select 判断回显位置
判断数据库名称
user表
数据
第三关:
加入参数,判断属于那种类型
通过报错信息可以发现是以单引号和括号进行闭合的
order by 判断数据库有几列
所以说三列,继续判断回显位置,找数据库,找表,找数据
第四关:
先加入参数并判断属于那种类型
判断长度,回显位置
注入攻击
第五关:
加入参数判断类型
爆库名
爆表名
发现只有1列 加入参数
爆列名
爆数据
9.使用sqlmap验证第一关
安装成功
判断是否注入点
存在注入
获取数据库
获取数据库中的表名
获取字段名
获取字段内容