Sql注入
什么是Sql注入呢?
Sql注入允许攻击者扰乱对数据库的查询,从而让攻击者查看到正常情况下看不到的数据,甚至删除或修改这些数据
Sql注入有哪些例子?
检索隐藏数据
系统会将用户输入直接拼接到Sql查询语句中,此时可通过注释符(--)取消掉后面限制条件的作用,为了让注释后的sql语句还能正常闭合需要在payload中加入配对的符号,如单引号(')
打破应用逻辑
burp以用户登录举例,正常情况下用户登录需要验证账号和密码,但是如果利用注释符发动Sql注入的话,在拼接到sql语句中时就会取消掉密码字段的作用,这样就会导致只需要用户名正确即可登入该用户
利用Union进行跨库查询
利用Union查询可以在前面语句闭合的情况下插入一条新的查询语句,这样就可以查询同一个数据库服务器下其他库的数据了,但是要想成功利用Union攻击,前后两个sql语句需要满足两个条件:
- 两者的返回结果需要有相同列数
- 两者查询结果的每一列中的数据类型也要兼容
那么我们为了满足这两个条件需要获取哪些数据呢:
- 获取前者查询结果的列数
- 判断前者查询结果中哪些列的数据类型可以存储注入攻击后的查询结果
如何确定利用Union的注入攻击所需的列数呢?
burp给出了两种获取攻击所需列数的方法
第一种,利用ORDER BY查询子句,不断递增列索引直到出现报错信息即可判断列数,究其原理,ORDER BY的用途就是将查询结果按照第几列排序,如果超出列数即会产生报错从而侧面判断出查询结果有多少列
第二种,利用在Union查询时不断添加空值(NULL)查询字段,如:
' union select [[null,]...]--
如果null的数量与前者查询结果的列数不匹配即会产生报错,反之则不会,此时即可判断前者查询结果有多少列
如何确定Union的查询结果中哪些列的数据类型是适合用来存放注入结果的呢?
在确定列数以后,将不同数据类型的测试字符串填充到不同的位置观察响应,如果某位置的数据类型与该位置的填充字符串数据类型不符即会报错,反之则不会,从而可判断当前位置适不适合存放注入的查询结果
如何利用Union注入查询敏感数据?
当知道目标表和各列的名字后即可在可存放注入结果的位置填充这些列从而得到某些敏感数据
如何在单列中检索多个值呢?
在Union注入语句中,利用不同种类数据库中的不同字段连接符将多列的查询结果连接成一个字符串,然后再添加一个可标识的符号区分不同字段
如何通过Sql注入获取数据库详细信息呢?
获取数据库的类型和版本
不同的数据库,查询数据库版本的语句不太一样,这时候可以fuzz一下对比一下结果就可以很直观地判断数据库的类型,当类型匹配时就顺便也能看到数据库版本了
枚举数据库的内容
大多数数据库会提供一个预览模式会提供关于数据库的一些信息,如当前数据库服务器有哪些库、表、列,非Oracle数据库利用的是information_schema,Oracle数据库利用的是all_tables、all_tab_columns
利用盲注
所谓盲注就是无法直接看到注入的结果,这时候Union注入就不管用了,只能靠各种方法去猜结果的每一位是什么字符,根据利用条件可以再分为三种:
- 布尔盲注
- 时间盲注
- 带外盲注
布尔盲注原理是什么?
布尔盲注就是响应的结果只有两种,此时只能通过一个字符一个字符地猜,不断缩小字符的范围从而确定是什么字符,布尔盲注的流程如下:
- 猜查询结果长度
length(列)[<,>,=][长度]
- 猜每一位字符
substring(列,[第几位],1)[<,>,=][字符]
报错盲注原理是什么?
报错盲注就是在布尔盲注无法生效的情况下的盲注手段,通过制造报错来重新输出可表示语句执行成功与否的响应,报错盲注的流程如下:
- 猜查询结果长度
报错模板语句(length(列)[<,>,=][长度])
- 猜每一位字符
报错模板语句(substring(列,[第几位],1)[<,>,=][字符])
时间盲注原理是什么?
时间盲注就是利用延时延时函数让sql语句成功执行时延时一定的时间再接收到响应,但是时间盲注生效有个前提条件就是支持堆叠查询,延时盲注的流程如下:
- 猜查询结果长度
延时模板语句(length(列)[<,>,=][长度])
- 猜每一位字符
延时模板语句(substring(列,[第几位],1)[<,>,=][字符])
带外盲注原理是什么?
带外盲注是在以上三种盲注手段都无法得到有判断价值的响应时使用的盲注手段,这是因为有的系统对处理HTTP请求和Sql查询是采用异步的方式执行的,但是通过在payload中加入带外地址的方法就可以在执行sql查询的时候将查询结果发送到指定的带外地址,常用的带外地址协议为DNS,这里可以利用burp自带的xss平台作为接收端,带外盲注的流程如下:
- 猜查询结果长度
带外模板语句(length(列)[<,>,=][长度])
- 猜每一位字符
带外模板语句(substring(列,[第几位],1)[<,>,=][字符])
如何检测Sql注入漏洞呢?
- 提交单引号('),并观察响应
- 提交一些sql语句,并观察响应
- 提交一些布尔条件语句,并观察响应
- 提交一些延时语句,并观察响应
- 提交一些附有带外地址的语句,并观察响应
不同情况下的Sql注入
- 存在更新值或where子句的update语句
- 存在插入值的insert语句
- 存在表或列名的select语句
- 存在oder by子句的select语句
二次Sql注入是什么?
二次注入就是将注入语句利用对输入过滤不严格存储到数据库中,当系统将该条数据取出并拼接到查询语句时执行了恶意的sql操作,如更改数据库记录等
如何防止Sql注入呢?
用参数化查询(或预编译)的方式代替简单地拼接
哈喽,这里还是梨子哦,本系列是梨子从burp官方在线靶场漏洞讲解中整理出来的配套学习笔记,难免有遗漏,若有任何疑问可以添加梨子的联系方式(base64解码)QVBDRVY1KOW+ruS/oSk=,请转载蹭流量的人自觉替换联系方式再粘贴,最后再显摆一下梨子的排名,嘻嘻嘻