一道go的sql预编译的CTF题

admin 2023年10月17日23:43:55评论69 views字数 1006阅读3分21秒阅读模式

写在前面

之前有提到过一篇文章预编译真的能完美防御SQL注入吗?,当时仅仅从理论上简单举个例子,最近碰巧看到一道简单的CTF是这个类型的,golang的SQL注入,就拿来记录一下。

题目分析

这是一道非常简单的题,我直接贴上关键代码了

func index(c *gin.Context) {  order := c.DefaultQuery("order", "id")  content := c.DefaultQuery("content", "1")  var news []News  db.Where("content LIKE ?", "%" + content + "%").Order(order).Find(&news)  c.JSON(200, news)}
func main() { r := gin.New() r.GET("/", index) r.Run(":8888")}

一看就得知这是一个web服务,从index函数中可以看出有两个参数一个order,一个content。

db.Where("content LIKE ?", "%" + content + "%").Order(order).Find(&news)

    关键在于这条语句,是golang的gorm写法,当我们看到?的时候,没错绝对是预编译,这个时候就不要再想content了,没用的。

    而正如之前文章(预编译真的能完美防御SQL注入吗?)提到过的order by这种是不可参数化的是无法被预编译的,那么就开始对order by进行盲注。

    这里我就不用具体的盲注语句了,只验证一下即可。

func main() {  var news []News  content := "%"  order := "(IF(1=1, SLEEP(2), 0))"  db.Where("content LIKE ?", "%"+content+"%").Order(order).Debug().Find(&news)  fmt.Println(news)}

    这里我简单写了个demo,可以看到我让content为%,这样就不影响后面order by的执行了,同时我加了Debug()方法,这是为了打印出完整的sql语句,毕竟这是gorm的写法

一道go的sql预编译的CTF题

    可以看到是执行了SLEEP,但是至于为啥SLEEP时间扩大了2倍,这个没研究明白,对go这块还是不太了解,但是预期是对的。

 

END

 



原文始发于微信公众号(飞羽技术工坊):一道go的sql预编译的CTF题

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月17日23:43:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一道go的sql预编译的CTF题https://cn-sec.com/archives/2122734.html

发表评论

匿名网友 填写信息