sql注入

SQL注入

sql注入就是web应用程序对用户入的数据合法性没有进行判断,前端传输参数由攻击者构造的sql语句被带入到了数据库,依靠构造sql语句可以进行查询,删除等操作,如果数据库权限很高,还可以对操作系统进行操作。

SQL注入的各种方式

注入点分类

  • 数字注入
  • 字符注入
  • 搜索注入

传参方式分类

  • get
  • post
  • cookie
  • http头部

返回信息类型分类

  • 布尔盲注

  • 报错注入

  • 时间注入

  • 联合查询注入

判断sql注入点是否存在

现在的网站功能强大,我们可以靠一些方法来判断是否存在注入点,常见的工具sqlmap,啊D,穿山甲都是一些很好的工具,而且上手方便,但是现在网站会配备waf,所以很多时候都需要自己手工判断是否存在注入。
话不多说直接上手(现在的防御做得好了,很多方法都会被知晓和防御)
一:URL处先加单引号’、双引号"、单括号)、双括号))等看看是否报错,如果报错就可能存在SQL注入漏洞了(但是现在基本会被过滤掉,也不排除一些世纪老站点还有这种)

二:还有在URL后面加 and 1=1 、 and 1=2 看页面是否显示一样,显示不一样的话,肯定存在SQL注入漏洞了

三:还有就是Timing Attack测试,也就是时间盲注。依靠响应时间来判断是否时间函数sleep被带入执行

容易出现的注入点:就是前端输入并且会被带入数据库执行的可输入区域,比如登录界面,依靠post传参的数据包中,涉及获取http头部信息。

与MYSQL数据库有关的杂项

在MYSQL5.0版本之后,MYSQL默认在数据库中存放一个“information_schema”
的数据库,这个库中我觉得只需要记住TABLES,COLUMNS,SCHEMATA这三个表。

  • SCHEMATA存储所有库名,借用书上的图片来看
    在这里插入图片描述

  • TABLES存储所有的库名和表名,其中记录数据库库名和表名的字段名分为是TABLE_SCHEMA和TABLE_NAME在这里插入图片描述

  • COLUMNS存储的是库名,表名和字段名,分别对应的字段名是TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME在这里插入图片描述

MYSQL的查询语句

1.1无已知的条件
SELECT 要查询的字段名 FROM 库名.表名
在知道一条条件后,
SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件的+0
SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件1的字段名=‘1条件的值’ AND已知条件的字段名=‘2的 值’

1.2limit
limit的使用格式是limit m,n,m为记录开始的位置,从0开始,表示第一条记录。n是指取n条记录。limit 0,1表示从第一条记录取一条记录。
1.3需要记住的几个函数

  • database():当前网站使用的数据库
  • version():当前mysql的版本
  • user():当前mysql的用户

1.4注释
在MYSQL中,常见注释符的表达方式:# /**/

接下来就是各种攻击啦

这里是引用在这里插入图片描述

没有图又懒得去搞靶机就将就看看思路吧,都是在理想条件下。
1.Union注入攻击:在url的id结尾添加一个单引号,再次访问,返回与之前的结果不同,访问id=1 and1=1,因为and 1=1 逻辑为真,所以返回与id=1相同结果。当访问id1=1 and 1=2时,返回不同结果,得出存在sql注入漏洞结论,然后用mysql数据库查询方法进行查询数据。
2.Boolean注入 攻击:在已有注入漏洞情况下不会直接返回数据信息而是返回yes和no的页面就可以尝试Boolean注入,构造sql判断语句查看页面返回结果来推测哪些判断条件是成立的,以此来获取数据库信息,都是依靠判断字段数来确认,字段数为某个值时返回与前一个字段数不同的结果即可判断字段数,然后利用burp进行爆破
3.报错注入攻击:程序直接将错误信息输出到页面上,所以此处可以利用报错注入获取数据。利用函数updatexml()

4.时间注入:利用sleep()或者benchmark()等函数让MYSQL的执行时间变化,会搭配IF()使用,IF(A,B,C),当A为ture时,返回B,否则返回C,这时候依靠burpsuite页面响应时间来判断,并且依靠响应时间来获取库名,表名,字段名和具体数据

5.XFF注入:依靠burp进行抓包,可以看到http头部参数X-Forewarded-For,就是XFF,代表真实ip,通过改变IP来测试是否存在注入,然后依靠union方法获取数据库。
6.BASE64注入::当url中id参数经过base64转码后,将单引号也进行转码,再次访问,order by 查询字段数,依靠union方法获取。
7.cookie:很多时候网站会返回客户端一个cookie值,类似与临时凭证的一串字符,有时候会存在id参数,burp改包再次访问,加入单引号测试是否存在漏洞,使用union方法完成。
8.宽字节注入:记得只有数据库编码是GBK时,这个方法才有用,很少使用到。
9.堆叠查询注入:执行多条语句,多语句之间以分号隔离。在第二个语句中构造自己想要执行的语句内容。
10.后台万能密码

传说中的万能密码

sql="select*from test where username=’ XX ’ and password=’ XX ’ ";

admin' or '1'='1                  XX         //万能密码(已知用户名)
XX                                  'or'1'='1     //万能密码(不需要知道用户名)
'or '1'='1'#                          XX         //万能密码(不知道用户名)

11.依靠各种工具:常用的测试工具sqlmap,穿山甲等sql注入工具
在这里插入图片描述
sqlmap -u,sqlmap -r 等命令进行测试
但是现在的安全护卫(dog)这么多很多方法都会被拦截,被直接过滤掉。就打靶机可能还有用。

所以就存在绕过waf的一些方法

1.大小写绕过
2.双写绕过
3.转换编码绕过
4.内联注释绕过:MYSQL的内联注释/* !
5.tamper绕过(相比来说可行性高),sqlmap的脚本。

SQL注入修复建议

1.过滤危险字符:很多的cms都采用的过滤危险字符方式,某些CMS采用正则表达式,检测到union,sleep,selecet等就会推出程序。
2.使用预编译语句:不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的操作,在其他大佬博客中看到了这些方法原理:SQL注入只对SQL语句的编译过程有破坏作用,而PreparedStatement已经预编译好了,执行阶段只是把输入串作为数据处理。而不再对SQL语句进行解析。因此也就避免了sql注入问题。
其他杂项:设置 Web 应用中用于连接数据库的用户对 Web 目录不允许有写权限。
严格限定参数类型和格式,明确参数检验的边界,必须在服务端正式处理之前对提交的数据的合法性进行检查

使用 Web 应用防火墙

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值