Web安全测试常见漏洞-SQL注入和命令注入

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.执行命令或者执行代码的场景

规避方法参考

对输入参数更加严格的校验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有被蠢哭到

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值