2026/2/14 17:28:34
网站建设
项目流程
死循环网站,推广计划和推广单元,微信群投票网站怎么做,seo优化自学一、先判断是否为注入点 (个人观点#xff0c;仅供参考)1.如果输入或者就直接报错#xff0c;说明他与数据库交互了#xff0c;则该处为注入点2.即使1中没有报错#xff0c;也不能说明无注入点#xff0c;可能是后台做了过滤#xff0c;可以尝试逻辑判断语句#…一、先判断是否为注入点 (个人观点仅供参考)1.如果输入或者就直接报错说明他与数据库交互了则该处为注入点2.即使1中没有报错也不能说明无注入点可能是后台做了过滤可以尝试逻辑判断语句例如对于数字型and 11,页面正常大概率就可以说明有sql注入了如果and 12 页面报错那就基本存在了如果and 12正常那就是字符注入了对于字符型1‘ and ’1‘’1 页面正常而1 and 11 页面报错(这里的报错是指页面直接返回了注入的字符等等)注还可以使用) and 12,) and 12,) and 12,)) and 12等等总之要不断尝试看看能不能让它报错注有些地方直接写) and 12--实际上我感觉是有些问题的那些人想的是同时把让页面报错和寻找闭合方式结合成同一步即直接让页面正常这也其实没什么问题但对于新手不太好理解这样就要回过来再判断到底是什么类型的注入比如说报错类型盲注因为我想的是先让它报错再观察页面变化就方便下一步的payload类型注入比如字符型还是updatexml()报错注入3.即使没有报错信息但是也可能存在注入点因为有时侯注入成功了但是数据库不会回显这时就可能存在盲注以及报错注入了报错注入是由于后台没有对数据库的报错信息进行屏蔽3.1 报错注入的快速判断方法1 and updatexml(1,~,3)--(观察页面是否有类似XPATH syntax error:~出现有则为报错注入)problem为什么用 and updataxml(1,concat(0x7e,(select password from users limit 0,1)))--,同时改变为limit 1,1和limit 2,1来翻页查看而不是 and updatexml(1,(select group_concat(password) from users),1)--答updatexml()和extractvalue()函数最多只能显示32个字符而group_concat()为聚合函数不能和limit联用也就是说当数据过多时只能显示部分数据而concat配合limit可以翻页查看所有的数据(可以在爆字段内容之前先用select count(*) from 表名来判断有多少行)下面以‘为例当然也可以为等等目的是为了让其报错3.2输入’不会报错但是页面有变化则为布尔盲注我们就要让前面那个条件为真通过不断改变payload来得到信息通过页面是否变化来判断payload的真伪例如admin and select length(database())7#通过改变7处的值直到页面变化就可以获得数据库的长度注意这里用and,并且admin是已知为真3.3当输入时没有报错并且页面没有变化但是响应时间变化了说明数据库与其交互了有时间盲注这和xss是十分相似的xss也是注入到代码中与代码交互了alert()的注入弹窗就相当于这里的页面变化响应时间的变化二、寻找闭合方式因为要使sql语法正确才可以执行后面的payload所以这一步的目的在于使异常报错的页面变成正常这一步就没什么好说的了就是字符型要注意用上注释符(--)(--)(#)三、接下来就是判断列数了当用union查询时1.使用union查询实际上不仅要列数对应还应该数据类型兼容不是相同但这与数据库的检查也有关系,mysql,postgresql,sqlite可以隐式把数字转化为字符串所以可以用 union select 1,2,3--来判断但是对于oracle检查严格这时就可以用NULL来判断了NULL可以转换成任意数据类型即 union select NULL,NULL,NULL,--所以对于数据库类型未知的推荐用NULL四、接下来就是确定回显位了 union select a,NULL,NULL--‘ union select NULL,’a‘,NULL--’ union select NULL,NULL,a--五、确定了回显位就十分简单了网上一堆教程接下来介绍有些绕过技巧大小写双写就不说了1.例如select关键字被过滤了在mysql中可以用CHAR(ASCII码),即CHAR(83)||CHAR(69)||CHAR(76)||CHAR(69)||CHAR(67)||CHAR(84),其中||为连接符当然也可以十六进制编码2.空格过滤2.1可以用/**/来代替空格如果要求必须包含某些关键字如foo才可以绕过直接在注释中插入/*foo*/2.2括号代替空格union select 12union(select(1),(2))2.3url编码代替空格%0a(换行符)、%0b(垂直制表符)、%0c(换页符)、%0D回车符、%09水平指标符3.-0-绕过当WAF过滤了or,and,union等等注意这个技巧在MySQL 8.0可能失效 -- 因为MySQL 8.0增强了类型安全后端代码select * from users where usernamexxx我们可以输入admin-0-,代码变为 select * from users where usernameadmin-0-,看成admin-0的运算由sql转换规则可知admin0,然后就是0-,可知转化为0结果就是0-00,于是就变成了username0,这就很有用了username0回和所有用户名比较而且比较时用户名会被转化为数字admin0为真husao0为真0aaa0为真也就是说所有以字符串开头的用户名或者前导0加上字母的与username0匹配都会返回trueselect 007;结果为7是不行的 注类似的还有0, *1 , admine0 (e为科学计数法)4.mysql的行内注释/*!关键字*/不加版本号默认执行4.1如果过滤了user()select/*user*/()select user()同理 or 11-- 等效于 or 1/*!*/1--4.2还有一个有趣点如果一个注释以!开头紧接着是数据库版本字符串只要数据库版本那个字符串程序就会把注释内容识别为sql语句否则不执行例如/*!32302 and 10*/只要mysql版本高于3.23.02注入上面的语句会使select的where语句为假主要用来判断版本号注意/*!sele*/*!ct/ username from users;这是错误的注释不能嵌套以上仅为个人观点可能会有错误的地方希望可以指出总之网安之路妙趣横生后续还有有趣的内容会补充的