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 |
|
1 |
|
1 |
|
以上查询结果都一样,等同于只输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 4– ,回显错误,说明有3列
看看页面有没有显示位
1 |
|
结果:
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 |
|
而我们之前注入的php源码则是这样:
1 |
|
所以加个’)’进行闭合就阔以啦!
实操,很ez
1 |
|
数字型注入知识点
数字型和字符型的区别
数字型传入的参数8是包裹在引号里的,传入的参会被转化为数字,比如传入id=1+1,系统会查找id=2的行
其注入方法,除了8需要用’闭合外,和字符型注入差不多
强制类型转换
php里的强制类型转换规则,和c可8大一样
比如输入’shit’,’1shit’,’2shit’,若强制转换为数字, 会分别被转为: 0,1,2
因为’shit’里,第一个字符8是数字,就会转化成0;’1shit’则会转化为1,忽略后面的非数字
在数字型注入想输入字符
2种方法
使用16进制
待填
使用char()函数
待填