sqli-labs1-6学习

sqli-labs1-6学习

SQLI,sql injection,我们称之为sql注入。何为sql,英文:Structured Query Language,叫做结构化查询语言。常见的结构化数据库有MySQL,MS SQL ,Oracle以及Postgresql。Sql语言就是我们在管理数据库时用到的一种。在我们的应用系统使用sql语句进行管理应用数据库时,往往采用拼接的方式形成一条完整的数据库语言,而危险的是,在拼接sql语句的时候,我们可以改变sql语句。从而让数据执行我们想要执行的语句,这就是我们常说的sql注入。
基于错误的注入
1:
首先输入1’,引起报错“You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1”,说明可能存在SQL注入,输入-- #(注释符,把后面的语句注释掉),页面正常回显,说明是单引号闭合注入。

Order by 判断字段数:

说明有3个字段。
2:

说明是数字型注入。

判断为3个字段。
使用union联合注入,进行联合操作时,当前一个语句选择内容为空,返回后面定义查询语句的结果:

图上显示了2和3,说明我们可以对第二个和第三个字段进行操作。
concat(str1,str2,…)——没有分隔符地连接字符串
concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号(默认)分隔每一条数据
爆库:

爆表:

爆 users 表的列

爆users表的数据:

3:

id=’1”’,单引号报错,双引号未报错是因为MySQL将其按两对单引号处理。返回的结果包含有一个小括号,初步判定为带一个括号的字符型注入。验证我们的猜想:

猜字段数:

3个字段。

可对2,3字段进行操作。
爆所有数据库:

爆当前表所属的数据库:

4:
1“引发报错,通过回显的错误信息初步判断为带括号的双引号注入:

猜字段:

1-4基于错误的注入:1、单引号;2、数字;3、带括号的单引号;4、带括号的双引号。
盲注:盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
5:

不再显示name和password的信息了。
猜测数据库版本号:

查看数据库长度:

猜测数据库第一位,猜测当前数据库名称:

大小比较的是ASCII码的大小,可采用二分法提高效率。
猜测第二位,第三位,,

获取security数据库下的表,获取security数据库下的第一个表的第一个字符:
http://localhost:81/sqli-labs/Less-5/?id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80 – #
limit函数:
1)limit a,b 后缀两个参数的时候(/参数必须是一个整数常量/),其中a是指记录开始的偏移量,b是指从第a+1条开始,取b条记录。
2)limit b 后缀一个参数的时候,是直接取值到第多少位,类似于:limit 0,b 。

limit 0,1(起点位置为0,开始查询,返回一条数据)
substr(string string,num start,num length);
string为字符串;
start为起始位置;
length为长度。
mysql中的start是从1开始的。

第一个表首字母为e。
获取第一个表的第二位字符,使用substr(**,2,1)即可。
获取第二个表 limit 1,1(从第1个开始,返回一条数据)。
Mysql中Regexp常见用法
模糊匹配,包含特定字符串

查找content字段中包含“车友俱乐部”的记录

select * from club_content where content regexp ‘车友俱乐部’

此时的regexp与like的以下用法是等同的

select * from club_content where content like ‘%车友俱乐部%’
模糊匹配,以特定字符串开头

查找content字段中以“车友”开头的记录

select * from club_content where content regexp ‘^车友’

此时的regexp与like的以下用法是等同的

select * from club_content where content like ‘车友%’
模糊匹配,以特定字符串结尾

查找content字段中以“车友”结尾的记录

select * from club_content where content regexp ‘车友$’

此时的regexp与like的以下用法是等同的

select * from club_content where content like ‘%车友’
模糊匹配,或关系

查找content字段中包含“心得”、“分享”或“技术贴”

select * from club_content where content REGEXP ‘心得|分享|技术贴’
模糊匹配,不包含单个字符

查找content字段中不包含“车”字、“友”字的记录

select * from club_content where content REGEXP [^车友]
选择users表中的列名是否有us**的列:
http://localhost:81/sqli-labs/Less-5/?id=1’ and 1=(select 1 from information_schema.columns where table_name=‘users’ and column_name regexp ‘^usern[a-z]’ limit 0,1)-- #

select 1,有时候为了提高效率,只是为了测试下某个表中是否存在记录,就用1来代替。
ORD(string)返回字符串第一个字符的ASCII值。
SQL MID()语法:SELECT MID(column_name,start[],length]) FROM table_name

D

u
floor()函数:向下取整,返回小于等于该值的最大整数。

ASCII 码 字符 ASCII 码 字符 ASCII 码 字符 ASCII 码 字符
十进位 十六进位 十进位 十六进位 十进位 十六进位 十进位 十六进位
032 20 056 38 8 080 50 P 104 68 h
033 21 ! 057 39 9 081 51 Q 105 69 i
034 22 " 058 3A : 082 52 R 106 6A j
035 23 # 059 3B ; 083 53 S 107 6B k
036 24 $ 060 3C < 084 54 T 108 6C l
037 25 % 061 3D = 085 55 U 109 6D m
038 26 & 062 3E > 086 56 V 110 6E n
039 27 ’ 063 3F ? 087 57 W 111 6F o
040 28 ( 064 40 @ 088 58 X 112 70 p
041 29 ) 065 41 A 089 59 Y 113 71 q
042 2A * 066 42 B 090 5A Z 114 72 r
043 2B + 067 43 C 091 5B [ 115 73 s
044 2C , 068 44 D 092 5C \ 116 74 t
045 2D - 069 45 E 093 5D ] 117 75 u
046 2E . 070 46 F 094 5E ^ 118 76 v
047 2F / 071 47 G 095 5F _ 119 77 w
048 30 0 072 48 H 096 60 ` 120 78 x
049 31 1 073 49 I 097 61 a 121 79 y
050 32 2 074 4A J 098 62 b 122 7A z
051 33 3 075 4B K 099 63 c 123 7B {
052 34 4 076 4C L 100 64 d 124 7C |
053 35 5 077 4D M 101 65 e 125 7D }
054 36 6 078 4E N 102 66 f 126 7E ~
055 37 7 079 4F O 103 67 g 127 7F DEL
rand()函数调用可以在0和1之间产生一个随机数。
BENCHMARK(count,expr)
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。用于mysql客户,它报告查询的执行时间。
ENCODE(str, pass_str):该函数使用pass_str作为密码来加密字符串str,其加密的结果可以通过DECODE()函数来解密。该函数返回的结果是一个同str等长。DECODE(crypt_str, pass_str):该函数使用pass_str作为密码来解密使用ENCODE()加密后的字符串crypt_str。
Sleep()休眠,参数是休眠时长,单位秒,可为小数。

6:
双引号闭合:

猜测数据库长度:

猜测数据库名称:

S

子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。
看一个简单的例子:
select concat((select database()));
真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。
group by 分组语句:
如有这样一个表:
customer price
alice 2300
charlie 4000
alice 700
bob 1600
bob 400
select customer,sum(price) from orders group by customer

得到的结果就是:
customer price
alice 3000
charlie 4000
bob 2000
如果没加group by,结果就有了重复项:
customer price
alice 3000
charlie 4000
alice 3000
bob 2000
bob 2000
Concat连接函数,rand()返回大于0、小于1之间的数,floor()返回小于等于你输入数的最大整数。
看一下双查询注入的一个简单组合:select floor(rand()*2);
从里向外看,rand() 返回大于0小于1的小数,乘以2之后就成了大于0小于2了。然后对结果进行取整。就只能是0或1了。也就是这个查询的结果不是1,就是0。
SELECT CONCAT((SELECT database()), FLOOR(RAND()*2));
返回security0或security1
如果在语句后加from 表名,一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录。

select concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;
把结果concat((select database()), floor(rand()*2))取名a,按a分组。这样相同的security0分到一组,security1分到一组。就剩下两个结果了。

使用聚合函数报错:

使用派生表来报错,select 1 from (table name);

0x3a对应ASCII码为 : (冒号) 0x7e对应ASCII码为 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值