判断注入点
联合查询注入是回显注入的一种也就是说,联合注入的前提是页面要有回显,但在这之前我们必须先找到注入点,例如一个网址http://abc.cn/new_list.php?id=1,当我们在后面网址后面加上and 1=1 或 and 1=2来判断页面的回显情况,当发生变化时,我们就找到了注入点。
另外根据具体情况可能需要在加入单引号或注释符等信息。
**—**该注释符后面要有一个空格。
# 对该行#后面的内容进行注释。
/* */ 注释符号内的内容;# 对该行#后面的内容进行注释。
判断注入类型
注入类型分成数字型注入和字符型注入。
数字型注入的sql语句:
select * from users where id = 1测试步骤:
加单引号,这时sql语句后面多了一个单引号,后面加注释,会报错。
加and 1=1,语句正常执行,页面与原始页面相同。
加and 1=2,语句也可以正常执行,但页面会与原始网页存在差距。
如满足以上三点,可以判断此处存在数字型注入:
字符型注入的sql语句:
select * from users where id = '1'同样加单引号,但后面要带上注释符来注释掉后面多余的单引号,具体还是拿sql语句直观看一下:
select * from users where id = '1' and 1=1 #'我们在网址之中手工注入了***’ and 1=1 #***,单引号的作用时用来闭合前一个单引号以便我们在后面继续加代码,#用来注释掉最后面多余的单引号。
判断是否回显
当我们找到注入点之后,就要用sql语句进行判断是否会回显了。还是之前的网址,我们在后面加入一些sql语句进行判断,原网址变为http://abc.cn/new_list.php?id=2 union all select 1,2,3,4。假设该注入为数字型注入,sql语句为:
select * from users where id = 2 union all select 1,2,3,4这条语句就是使用联合查询来判断是否会回显,我将id=1改为id=2,是为了让原sql信息查询失败无数据返回,从而用我们union的语句来返回数据(注意select 1,2,3,4的具体查询列数要原sql查询列数相同),这个时候如果把 1,2,3,4 返回到页面中那就可以判断页面可以回显(具体页面查看是哪几列数据回显到页面的哪几个位置),我们就可以开心的进行Union注入了,反之我们只能另寻他法。当然我们要具体情况具体分析。
根据库名确认表名
上面我们已经确定了原sql的列数和回显位置,就可以直接用sql去获取我们所需要的表的名字了。
假设第二列是回显位置,则具体sql为:
http://abc.cn/new_list.php?id=2 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database();group_concat()是Mysql中的一个聚合函数,具体作用是将多行数据合并为一个字符串,并用指定的分隔符连接起来。
information_schema是一个信息数据库,保存关于MySQL服务器所维护的所有其他数据库的信息,如数据库或表的名称,列的数据类型或访问权限等。其中的schemata表、tables表和columns表是我们常用的表。
根据表名确定字段名
假设我们获取到的表名为users,则可以通过下面sql获取到字段名。
http://abc.cn/new_list.php?id=2 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' and table_schema=database();根据字段名拿到数据
这个时候我们就可以通过表名和字段名拿到用户的账号和密码了。
http://abc.cn/new_list.php?id=2 union select 1, name,passwd,4 from users解密相关
一般用户的密码都是加密的,可能会用到各种算法进行加密,这里我们用MD5进行举例:假设密码加密后是一个标准的32位16进制数据(例如CD7F6DD891930529F7564EF0E81248E1),那就很有可能是MD5算法加密的,这个时候我们只能进行撞库(MD5是一个散列值算法无法进行解密),具体方法就是利用MD5算法将对我们穷举的密码进行加密,用加密后的密文与密码进行比较。当然更简单的办法是去网上寻找MD5明文密文对照表或者相关解密网站。