SQL注入原理
我的理解是在与服务器数据库进行数据交互的地方拼接了恶意的sql代码,达到欺骗服务器执行恶意代码的目的。本质上是程序把用户输入的数据当成了sql语句执行。
SQL注入攻击思路
- 寻找注入点,判断闭合拼接
- 判断数据库类型版本
- 判断页面回馈寻找获取数据的方式
- 根据掌握的信息进行攻击
SQL注入的分类
- 判断某个链接是否存在SQL注入,可以通过对其传入的可控参数进行简单的构造,通过服务端返回的内容来判断有无注入 ,注入位置有GET数据(大多存在地址栏)、POST数据(大多存在输入框中)、HTTP头部、cookie数据。
- 不同的数据库内置的函数和结构都不同,所以一开始要确定数据库来确定payload。
- 从页面反馈有选择注入手法:有回显时联合查询注入、无回显时报错型注入、布尔型注入、延时注入
- 还有一些注入思路,如加解密注入是因为服务器代码对数据进行了加密,所以payload要先解密在拼接后加密才能成功。二次注入是先存储脏数据进入数据库后再执行恶意代码。DNSlog注入是通过dns解析服务把信息显示在dns服务器上。堆叠注入是在语句结束后再构建一条恶意sql。
SQL注入的危害
也可以说是sql注入能达到的效果。分为两类:
危害数据库里的数据、
- 数据库信息泄露
- 网页篡改:登陆后台后发布恶意内容
- 私自添加系统账号
直接危害到网站的权限(需要满足条件)
- 网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人
- 读写文件获取webshell
服务端返回错误形式
- 错误直接回显在页面上
- 错误隐藏在页面源代码中
- 检测到错误跳转到另一个页面
- 返回HTTP错误代码500或重定向302
- 适当处理错误结果,常显示一个通用错误页面
注入点参数类型
常见闭合符号: 单引号'' 双引号 "" 括号( ) 中括号{}以及它们的不同组合
注释符号 --+(常用于get型上) --空格 # --%20
闭合符号的解释 SQL注入中,注释#、 --+、 --%20、 %23到底是什么意思?sqli-labs-master_Dooz的博客-CSDN博客_%23是什么
- 数字
如果是数字的话可能不存在单引号, 在数字上加单引号也是有可能的,要看对方的写法
- 字符
一般是采用单引号,如果参数是字符的话那肯定是有单引号的, 即使有注入也会带入单引号里,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉
- 搜索
将数据进行搜索并进行展示,搜索是模糊查询,闭合符号是'% %'
- JSON
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在键值对中
- 数据由逗号分隔
JSON值
-
-
- 数字(整数或浮点数) {"age":30 }
- 字符串(在双引号中) {"uname":"yang"}
- 逻辑值(true 或 false) {"flag":true }
- 数组(在中括号中){"sites":[{"name":"yang"},{"name":"ming"}]}
- 对象(在大括号中)JSON 对象在大括号({})中书写:
- null { "runoob":null }
-
注入提交方式
根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看,找到Request Headers(请求头) ,不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。在注入时候需要按照网站的请求方法去注入。
- GET POST COOKIE REQUEST HTTP 头
小知识
a. GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
b. GET方法无法接收POST的值 在POST情况下GET的值只要在网址后面就能接收。