SQL注入
原理:
程序在执行查询时,底层调用的是数据库查询语句,如我们要查一个叫Bob的人,需要前端输入Bob,再组成值
select * from user_table where name='Bob'
若此时我们前端输入aaa' or 1=1 or '1' = '1
这时候后端的查询语句就变成了
select * from user_table where name='aaa' or 1=1 or '1' = '1'
相信熟悉SQL语句的友友们已经看出两句话的天壤之别了吧,第一句是查Bob,第二句因为有个or 1=1必成立项,是直接查所有内容出来。
正常情况下:前端提交的数据,应该是作为SQL的执行参数的,而在这种情况下,前端提交的数据直接会导致后端返回大量数据,试想若是身份证查询等场景有这种漏洞,后果会如何。
同理,delete也可如此,试想一下
delete 字段 where id='1'
常见sql注入攻击:
1.未正确过滤转义字符
在用户的输入没有被转义字符过滤的时候,会发生的一种攻击,如后端代码为:
name = "SELECT * FROM user WHERE username='" + username + "'
这种情况如果攻击者输入bob’ or ‘1’='1时,该语句就会变形为如下
select * from user where username= 'bob' or '1' = '1';
甚至在一些sql服务器上可以这样操作,输入 2’;drop table user变形为删表语句
select * from user where username= '2';drop table user;
2.注入不正确的数据类型
如果用户输入的字段不是一种强类型,且程序中没有检查用户输入的合法性,就会发生这种攻击,例如后端语句:
name = "select name from user where id = " + number + ";"
这段代码中,程序员是想要只接收数字类型的数据的,但是没有过滤,我们就可以后面接;drop table user语句
3.时间延迟注入
有时候可以通过数据库查询的响应时间推断出敏感信息,如后端语句
name = "SELECT * FROM user WHERE username='" + username + "'
我们输入bob’ OR SLEEP(10),就会变形为
SELECT * FROM user WHERE username='' OR SLEEP(10)';
我们可以观察应用程序的响应时间来判断是否存在用户bob。
规避方法参考
1.输入验证和过滤:对于用户输入的内容,进行必要的验证和过滤,确保只接收合法的输入。可以使用正则表达式、白名单过滤或其他验证机制来检查输入的数据类型和格式
2.使用参数化查询或预编译语句:使用绑定参数的方式来构建查询语句,而不是直接拼接用户输入。这样可以将用户输入视为数据,而不是代码的一部分,避免了注入攻击的风险
3.最小化特权:确保数据库连接和执行查询的账户只具有最低的权限,限制对敏感数据和数据库操作的访问。
远程命令注入
原理:
与SQL注入类似,程序在执行查询时,底层调用可能是方法+数据的模式,如我们要调用一个功能ping,我们输入的值是127.0.0.1,底层逻辑可能为
ping 127.0.0.1
很明显,调用的是ping方法,数据是127.0.0.1,试想一下,若此时我们输入的值为127.0.0.1 | ls ./
语句变成了
ping 127.0.0.1 | rm -rf ./
即在ping的同时通过管道符|删除了当前目录,后果可想而知
挖掘思路
1.能动态执行的场景
2.执行命令或者执行代码的场景
规避方法参考
对输入参数更加严格的校验